--- a/src/eric7/UI/UserInterface.py Mon Oct 31 14:07:57 2022 +0100 +++ b/src/eric7/UI/UserInterface.py Wed Nov 30 09:19:51 2022 +0100 @@ -7,78 +7,90 @@ Module implementing the main user interface. """ -import os -import sys -import logging -import shutil -import json +import contextlib import datetime -import getpass import functools -import contextlib +import getpass +import json +import logging +import os import pathlib - +import shutil +import sys + +from PyQt6 import sip +from PyQt6.Qsci import QSCINTILLA_VERSION_STR from PyQt6.QtCore import ( - pyqtSlot, - QTimer, - QFile, - pyqtSignal, PYQT_VERSION_STR, QDate, + QFile, QIODevice, - qVersion, + QObject, QProcess, QSize, + Qt, + QThread, + QTimer, QUrl, - QObject, - Qt, + QUrlQuery, QUuid, - QThread, - QUrlQuery, + pyqtSignal, + pyqtSlot, + qVersion, ) -from PyQt6.QtGui import QAction, QKeySequence, QDesktopServices, QSessionManager +from PyQt6.QtGui import QAction, QDesktopServices, QKeySequence, QSessionManager +from PyQt6.QtNetwork import QNetworkAccessManager, QNetworkProxyFactory from PyQt6.QtWidgets import ( - QSizePolicy, - QWidget, - QWhatsThis, - QToolBar, + QApplication, QDialog, - QSplitter, - QApplication, - QMenu, - QVBoxLayout, QDockWidget, QLabel, + QMenu, + QSizePolicy, + QSplitter, + QToolBar, + QVBoxLayout, + QWhatsThis, + QWidget, ) -from PyQt6.Qsci import QSCINTILLA_VERSION_STR -from PyQt6.QtNetwork import QNetworkProxyFactory, QNetworkAccessManager - -from .Info import Version, VersionOnly, BugAddress, Program, FeatureAddress -from . import Config -from .NotificationWidget import NotificationTypes - -from eric7.EricWidgets.EricSingleApplication import EricSingleApplicationServer + +from eric7 import Globals, Preferences, Testing, Utilities +from eric7.CondaInterface.Conda import Conda +from eric7.Debugger.DebugServer import DebugServer +from eric7.Debugger.DebugUI import DebugUI +from eric7.EricGui import EricPixmapCache from eric7.EricGui.EricAction import EricAction, createActionGroup -from eric7.EricWidgets.EricToolBarManager import EricToolBarManager -from eric7.EricWidgets import EricMessageBox, EricFileDialog, EricErrorMessage -from eric7.EricWidgets.EricApplication import ericApp -from eric7.EricWidgets.EricMainWindow import EricMainWindow -from eric7.EricWidgets.EricZoomWidget import EricZoomWidget -from eric7.EricWidgets.EricClickableLabel import EricClickableLabel - -from eric7 import Globals, Preferences, Utilities - -from eric7.EricGui import EricPixmapCache - -from eric7.Sessions.SessionFile import SessionFile - -from eric7.Tasks.TasksFile import TasksFile - from eric7.EricNetwork.EricNetworkIcon import EricNetworkIcon from eric7.EricNetwork.EricNetworkProxyFactory import ( EricNetworkProxyFactory, proxyAuthenticationRequired, ) +from eric7.EricWidgets import EricErrorMessage, EricFileDialog, EricMessageBox +from eric7.EricWidgets.EricApplication import ericApp +from eric7.EricWidgets.EricClickableLabel import EricClickableLabel +from eric7.EricWidgets.EricMainWindow import EricMainWindow +from eric7.EricWidgets.EricSingleApplication import EricSingleApplicationServer +from eric7.EricWidgets.EricToolBarManager import EricToolBarManager +from eric7.EricWidgets.EricZoomWidget import EricZoomWidget +from eric7.EricXML.SessionReader import SessionReader +from eric7.EricXML.TasksReader import TasksReader +from eric7.Globals import getConfig +from eric7.MultiProject.MultiProject import MultiProject +from eric7.PipInterface.Pip import Pip +from eric7.PluginManager.PluginManager import PluginManager +from eric7.PluginManager.PluginRepositoryDialog import PluginRepositoryDownloadCleanup +from eric7.Preferences import Shortcuts +from eric7.Project.Project import Project +from eric7.QScintilla.SpellChecker import SpellChecker +from eric7.Sessions.SessionFile import SessionFile +from eric7.Tasks.TasksFile import TasksFile +from eric7.Testing.TestingWidget import clearSavedHistories +from eric7.Utilities.BackgroundService import BackgroundService +from eric7.VirtualEnv.VirtualenvManager import VirtualenvManager + +from . import Config +from .Info import BugAddress, FeatureAddress, Program, Version, VersionOnly +from .NotificationWidget import NotificationTypes try: from eric7.EricNetwork.EricSslErrorHandler import ( @@ -90,8 +102,6 @@ except ImportError: SSL_AVAILABLE = False -from eric7.Globals import getConfig - class Redirector(QObject): """ @@ -287,56 +297,40 @@ # Generate the conda interface logging.debug("Creating Conda Interface...") - from eric7.CondaInterface.Conda import Conda - self.condaInterface = Conda(self) ericApp().registerObject("Conda", self.condaInterface) # Generate the pip interface logging.debug("Creating Pip Interface...") - from eric7.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 eric7.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 eric7.Project.Project import Project - self.project = Project(self) ericApp().registerObject("Project", self.project) - from eric7.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 eric7.Debugger.DebugServer import DebugServer - self.__debugServer = DebugServer( self.__originalPathString, project=self.project, parent=self ) # Create the background service object - from eric7.Utilities.BackgroundService import BackgroundService - self.backgroundService = BackgroundService(self) splash.showMessage(self.tr("Initializing Plugin Manager...")) # Initialize the Plugin Manager (Plugins are initialized later - from eric7.PluginManager.PluginManager import PluginManager - self.pluginManager = PluginManager( self, self.__disabledPlugins, develPlugin=plugin ) @@ -348,14 +342,14 @@ self.__webBrowserSAName = QUuid.createUuid().toString()[1:-1] # set spellchecker defaults - from eric7.QScintilla.SpellChecker import SpellChecker - SpellChecker.setDefaultLanguage( Preferences.getEditor("SpellCheckingDefaultLanguage") ) with contextlib.suppress(ImportError, AttributeError): - from eric7.EricWidgets.EricSpellCheckedTextEdit import SpellCheckMixin + from eric7.EricWidgets.EricSpellCheckedTextEdit import ( # __IGNORE_WARNING__ + SpellCheckMixin, + ) pwl = SpellChecker.getUserDictionaryPath(isException=False) pel = SpellChecker.getUserDictionaryPath(isException=True) @@ -374,8 +368,6 @@ # Generate the debugger part of the ui logging.debug("Creating Debugger UI...") - from eric7.Debugger.DebugUI import DebugUI - self.debuggerUI = DebugUI( self, self.viewmanager, self.__debugServer, self.debugViewer, self.project ) @@ -411,89 +403,30 @@ self.taskViewer.displayFile.connect(self.viewmanager.openSourceFile) - self.projectBrowser.psBrowser.sourceFile[str].connect( - self.viewmanager.openSourceFile - ) - self.projectBrowser.psBrowser.sourceFile[str, int].connect( - self.viewmanager.openSourceFile - ) - self.projectBrowser.psBrowser.sourceFile[str, list].connect( - self.viewmanager.openSourceFile - ) - self.projectBrowser.psBrowser.sourceFile[str, int, str].connect( + self.projectBrowser.appendStderr.connect(self.appendToStderr) + self.projectBrowser.appendStdout.connect(self.appendToStdout) + self.projectBrowser.sourceFile[str].connect(self.viewmanager.openSourceFile) + self.projectBrowser.sourceFile[str, int].connect( self.viewmanager.openSourceFile ) - self.projectBrowser.psBrowser.closeSourceWindow.connect( - self.viewmanager.closeWindow - ) - self.projectBrowser.psBrowser.testFile.connect(self.__startTestScript) - - self.projectBrowser.pfBrowser.designerFile.connect(self.__designer) - self.projectBrowser.pfBrowser.sourceFile.connect( + self.projectBrowser.sourceFile[str, list].connect( 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.projectBrowser.pfBrowser.appendStderr.connect(self.appendToStderr) - - self.projectBrowser.prBrowser.sourceFile.connect( - self.viewmanager.openSourceFile - ) - self.projectBrowser.prBrowser.closeSourceWindow.connect( - self.viewmanager.closeWindow - ) - self.projectBrowser.prBrowser.appendStderr.connect(self.appendToStderr) - - self.projectBrowser.ptBrowser.linguistFile.connect(self.__linguist) - self.projectBrowser.ptBrowser.sourceFile.connect( + self.projectBrowser.sourceFile[str, int, str].connect( 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.projectBrowser.ptBrowser.appendStdout.connect(self.appendToStdout) - self.projectBrowser.ptBrowser.appendStderr.connect(self.appendToStderr) - - self.projectBrowser.piBrowser.sourceFile[str].connect( - self.viewmanager.openSourceFile - ) - self.projectBrowser.piBrowser.sourceFile[str, int].connect( - self.viewmanager.openSourceFile - ) - self.projectBrowser.piBrowser.closeSourceWindow.connect( - 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.projectBrowser.ppBrowser.sourceFile[str, int].connect( - self.viewmanager.openSourceFile - ) - self.projectBrowser.ppBrowser.closeSourceWindow.connect( - 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.projectBrowser.poBrowser.closeSourceWindow.connect( - 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.projectBrowser.closeSourceWindow.connect(self.viewmanager.closeWindow) + self.projectBrowser.testFile.connect(self.__startTestScript) + self.projectBrowser.designerFile.connect(self.__designer) + self.projectBrowser.uipreview.connect(self.__UIPreviewer) + self.projectBrowser.trpreview[list].connect(self.__TRPreviewer) + self.projectBrowser.trpreview[list, bool].connect(self.__TRPreviewer) + self.projectBrowser.linguistFile.connect(self.__linguist) + self.projectBrowser.pixmapEditFile.connect(self.__editPixmap) + self.projectBrowser.pixmapFile.connect(self.__showPixmap) + self.projectBrowser.svgFile.connect(self.__showSvg) + self.projectBrowser.umlFile.connect(self.__showUml) + self.projectBrowser.binaryFile.connect(self.__openHexEditor) self.project.sourceFile.connect(self.viewmanager.openSourceFile) self.project.designerFile.connect(self.__designer) @@ -525,13 +458,12 @@ 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.debuggerUI.compileResources.connect( - self.projectBrowser.prBrowser.compileChangedResources - ) - self.debuggerUI.executeMake.connect(self.project.executeMake) + self.debuggerUI.processChangedProjectFiles.connect( + self.projectBrowser.processChangedProjectFiles + ) + self.debuggerUI.processChangedProjectFiles.connect( + self.project.processChangedProjectFiles + ) self.debuggerUI.appendStdout.connect(self.appendToStdout) self.__debugServer.clientDisassembly.connect( @@ -552,27 +484,6 @@ self.preferencesChanged.connect(self.shell.handlePreferencesChanged) self.preferencesChanged.connect(self.project.handlePreferencesChanged) self.preferencesChanged.connect(self.projectBrowser.handlePreferencesChanged) - self.preferencesChanged.connect( - self.projectBrowser.psBrowser.handlePreferencesChanged - ) - self.preferencesChanged.connect( - self.projectBrowser.pfBrowser.handlePreferencesChanged - ) - self.preferencesChanged.connect( - self.projectBrowser.prBrowser.handlePreferencesChanged - ) - self.preferencesChanged.connect( - self.projectBrowser.ptBrowser.handlePreferencesChanged - ) - self.preferencesChanged.connect( - self.projectBrowser.piBrowser.handlePreferencesChanged - ) - self.preferencesChanged.connect( - self.projectBrowser.ppBrowser.handlePreferencesChanged - ) - self.preferencesChanged.connect( - self.projectBrowser.poBrowser.handlePreferencesChanged - ) self.preferencesChanged.connect(self.taskViewer.handlePreferencesChanged) self.preferencesChanged.connect(self.pluginManager.preferencesChanged) self.preferencesChanged.connect(self.__debugServer.preferencesChanged) @@ -752,15 +663,9 @@ self.pluginManager.initPluginToolbars(self.toolbarManager) if Preferences.getPluginManager("StartupCleanup"): splash.showMessage(self.tr("Cleaning Plugins Download Area...")) - from eric7.PluginManager.PluginRepositoryDialog import ( - PluginRepositoryDownloadCleanup, - ) - PluginRepositoryDownloadCleanup(quiet=True) # now read the keyboard shortcuts for all the actions - from eric7.Preferences import Shortcuts - Shortcuts.readShortcuts() # restore toolbar manager state @@ -797,9 +702,10 @@ # environment splash.showMessage(self.tr("Starting Debugger...")) if Preferences.getShell("StartWithMostRecentlyUsedEnvironment"): - self.__debugServer.startClient( - False, venvName=Preferences.getShell("LastVirtualEnvironment") - ) + venvName=Preferences.getShell("LastVirtualEnvironment") + if venvName == "embedded environment": + venvName = "" + self.__debugServer.startClient(False, venvName=venvName) else: self.__debugServer.startClient(False) @@ -841,66 +747,62 @@ """ Private method to create the various application objects. """ + from eric7 import ViewManager + from eric7.Debugger.DebugViewer import DebugViewer + from eric7.JediInterface.AssistantJedi import AssistantJedi + from eric7.MultiProject.MultiProjectBrowser import MultiProjectBrowser + from eric7.PluginManager.PluginRepositoryDialog import PluginRepositoryWidget + from eric7.Project.ProjectBrowser import ProjectBrowser + from eric7.QScintilla.Shell import ShellAssembly + from eric7.Tasks.TaskViewer import TaskViewer + from eric7.VCS.StatusWidget import StatusWidget + from eric7.VirtualEnv.VirtualenvManagerWidgets import VirtualenvManagerWidget + + from .LogView import LogViewer + from .Previewer import Previewer + from .PythonAstViewer import PythonAstViewer + from .PythonDisViewer import PythonDisViewer + # Create the view manager depending on the configuration setting logging.debug("Creating Viewmanager...") - from eric7 import ViewManager - self.viewmanager = ViewManager.factory( 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 eric7.Project.ProjectBrowser import ProjectBrowser - self.projectBrowser = ProjectBrowser(self.project) # Create the multi project browser logging.debug("Creating Multiproject Browser...") - from eric7.MultiProject.MultiProjectBrowser import MultiProjectBrowser - self.multiProjectBrowser = MultiProjectBrowser(self.multiProject, self.project) # Create the task viewer part of the user interface logging.debug("Creating Task Viewer...") - from eric7.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 eric7.Debugger.DebugViewer import DebugViewer - self.debugViewer = DebugViewer(self.__debugServer) # Create the shell logging.debug("Creating Shell...") - from eric7.QScintilla.Shell import ShellAssembly - self.shellAssembly = ShellAssembly( self.__debugServer, self.viewmanager, self.project, True ) @@ -909,7 +811,9 @@ if Preferences.getUI("ShowTemplateViewer"): # Create the template viewer part of the user interface logging.debug("Creating Template Viewer...") - from eric7.Templates.TemplateViewer import TemplateViewer + from eric7.Templates.TemplateViewer import ( # __IGNORE_WARNING_I101__ + TemplateViewer, + ) self.templateViewer = TemplateViewer(None, self.viewmanager) else: @@ -919,7 +823,7 @@ if Preferences.getUI("ShowFileBrowser"): # Create the file browser logging.debug("Creating File Browser...") - from .Browser import Browser + from .Browser import Browser # __IGNORE_WARNING_I101__ self.browser = Browser() else: @@ -929,7 +833,7 @@ if Preferences.getUI("ShowSymbolsViewer"): # Create the symbols viewer logging.debug("Creating Symbols Viewer...") - from .SymbolsWidget import SymbolsWidget + from .SymbolsWidget import SymbolsWidget # __IGNORE_WARNING_I101__ self.symbolsViewer = SymbolsWidget() else: @@ -939,7 +843,9 @@ if Preferences.getUI("ShowCodeDocumentationViewer"): # Create the code documentation viewer logging.debug("Creating Code Documentation Viewer...") - from .CodeDocumentationViewer import CodeDocumentationViewer + from .CodeDocumentationViewer import ( # __IGNORE_WARNING_I101__ + CodeDocumentationViewer, + ) self.codeDocumentationViewer = CodeDocumentationViewer(self) else: @@ -949,7 +855,9 @@ if Preferences.getUI("ShowPyPIPackageManager"): # Create the PyPI package manager logging.debug("Creating PyPI Package Manager...") - from eric7.PipInterface.PipPackagesWidget import PipPackagesWidget + from eric7.PipInterface.PipPackagesWidget import ( # __IGNORE_WARNING__ + PipPackagesWidget, + ) self.pipWidget = PipPackagesWidget(self.pipInterface) else: @@ -959,7 +867,9 @@ if Preferences.getUI("ShowCondaPackageManager"): # Create the conda package manager logging.debug("Creating Conda Package Manager...") - from eric7.CondaInterface.CondaPackagesWidget import CondaPackagesWidget + from eric7.CondaInterface.CondaPackagesWidget import ( # __IGNORE_WARNING__ + CondaPackagesWidget, + ) self.condaWidget = CondaPackagesWidget(self.condaInterface) else: @@ -969,7 +879,9 @@ if Preferences.getUI("ShowCooperation"): # Create the chat part of the user interface logging.debug("Creating Chat Widget...") - from eric7.Cooperation.ChatWidget import ChatWidget + from eric7.Cooperation.ChatWidget import ( # __IGNORE_WARNING_I101__ + ChatWidget, + ) self.cooperation = ChatWidget(self) else: @@ -979,7 +891,7 @@ if Preferences.getUI("ShowIrc"): # Create the IRC part of the user interface logging.debug("Creating IRC Widget...") - from eric7.Network.IRC.IrcWidget import IrcWidget + from eric7.Network.IRC.IrcWidget import IrcWidget # __IGNORE_WARNING_I101__ self.irc = IrcWidget(self) else: @@ -989,7 +901,9 @@ if Preferences.getUI("ShowMicroPython"): # Create the MicroPython part of the user interface logging.debug("Creating MicroPython Widget...") - from eric7.MicroPython.MicroPythonWidget import MicroPythonWidget + from eric7.MicroPython.MicroPythonWidget import ( # __IGNORE_WARNING_I101__ + MicroPythonWidget, + ) self.microPythonWidget = MicroPythonWidget(self) else: @@ -999,7 +913,7 @@ if Preferences.getUI("ShowNumbersViewer"): # Create the numbers viewer logging.debug("Creating Numbers Viewer...") - from .NumbersWidget import NumbersWidget + from .NumbersWidget import NumbersWidget # __IGNORE_WARNING_I101__ self.numbersViewer = NumbersWidget() else: @@ -1008,13 +922,9 @@ # Create the Jedi Assistant logging.debug("Creating Jedi Assistant...") - from eric7.JediInterface.AssistantJedi import AssistantJedi - self.jediAssistant = AssistantJedi(self, self.viewmanager, self.project) # Create the plug-ins repository viewer - from eric7.PluginManager.PluginRepositoryDialog import PluginRepositoryWidget - self.pluginRepositoryViewer = PluginRepositoryWidget( self.pluginManager, integrated=True, parent=self ) @@ -1023,8 +933,6 @@ ) # Create the virtual environments management widget - from eric7.VirtualEnv.VirtualenvManagerWidgets import VirtualenvManagerWidget - self.__virtualenvManagerWidget = VirtualenvManagerWidget( self.virtualenvManager, self ) @@ -1033,7 +941,7 @@ self.__replaceFileDialog = None if Preferences.getUI("ShowFindFileWidget"): # Create the find in files widget - from .FindFileWidget import FindFileWidget + from .FindFileWidget import FindFileWidget # __IGNORE_WARNING_I101__ self.__findFileWidget = FindFileWidget(self.project, self) self.__findFileWidget.sourceFile.connect(self.viewmanager.openSourceFile) @@ -1049,7 +957,9 @@ self.__findLocationDialog = None if Preferences.getUI("ShowFindLocationWidget"): # Create the find location (file) widget - from .FindLocationWidget import FindLocationWidget + from .FindLocationWidget import ( # __IGNORE_WARNING_I101__ + FindLocationWidget, + ) self.__findLocationWidget = FindLocationWidget(self.project, self) self.__findLocationWidget.sourceFile.connect( @@ -1065,8 +975,6 @@ self.__findLocationWidget = None # Create the VCS Status widget - from eric7.VCS.StatusWidget import StatusWidget - self.__vcsStatusWidget = StatusWidget(self.project, self.viewmanager, self) if ( @@ -1075,7 +983,9 @@ ): # Create the embedded help viewer logging.debug("Creating Internal Help Viewer...") - from eric7.HelpViewer.HelpViewerWidget import HelpViewerWidget + from eric7.HelpViewer.HelpViewerWidget import ( # __IGNORE_WARNING_I101__ + HelpViewerWidget, + ) self.__helpViewerWidget = HelpViewerWidget(self) else: @@ -1140,8 +1050,8 @@ Private method to create the Toolboxes layout. """ from eric7.EricWidgets.EricToolBox import ( + EricHorizontalToolBox, EricVerticalToolBox, - EricHorizontalToolBox, ) logging.debug("Creating Toolboxes Layout...") @@ -4365,6 +4275,8 @@ """ Private slot to set up the status bar. """ + from eric7.VCS.StatusMonitorLed import StatusMonitorLedWidget + self.__statusBar = self.statusBar() self.__statusBar.setSizeGripEnabled(True) @@ -4446,8 +4358,6 @@ self.sbZoom, ) - from eric7.VCS.StatusMonitorLed import StatusMonitorLedWidget - self.sbVcsMonitorLed = StatusMonitorLedWidget(self.project, self.__statusBar) self.__statusBar.addPermanentWidget(self.sbVcsMonitorLed) @@ -4605,12 +4515,8 @@ from .VersionsDialog import VersionsDialog try: - try: - from PyQt6 import sip - except ImportError: - import sip sip_version_str = sip.SIP_VERSION_STR - except (ImportError, AttributeError): + except AttributeError: sip_version_str = "sip version not available" sizeStr = "64-Bit" if sys.maxsize > 2**32 else "32-Bit" @@ -4632,13 +4538,13 @@ PYQT_VERSION_STR ) with contextlib.suppress(ImportError, AttributeError): - from PyQt6 import QtCharts + from PyQt6 import QtCharts # __IGNORE_WARNING_I10__ 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 + from PyQt6 import QtWebEngineCore # __IGNORE_WARNING_I10__ versionText += ( """<tr><td><b>PyQt6-WebEngine</b></td><td>{0}</td></tr>""" @@ -4652,7 +4558,9 @@ # webengine (chromium) version with contextlib.suppress(ImportError): - from eric7.WebBrowser.Tools import WebBrowserTools + from eric7.WebBrowser.Tools import ( # __IGNORE_WARNING_I101__ + WebBrowserTools, + ) ( chromiumVersion, @@ -4711,6 +4619,8 @@ @param deleteAttachFile flag indicating to delete the attached file after it has been sent (boolean) """ + from .EmailDialog import EmailDialog + if Preferences.getUser("UseSystemEmailClient"): self.__showSystemEmailClient(mode, attachFile, deleteAttachFile) else: @@ -4730,8 +4640,6 @@ self.showPreferences("emailPage") return - from .EmailDialog import EmailDialog - self.dlg = EmailDialog(mode=mode) if attachFile is not None: self.dlg.attachFile(attachFile, deleteAttachFile) @@ -4773,11 +4681,11 @@ Public method to check for the presence of an error log and ask the user, what to do with it. """ + from .ErrorLogDialog import ErrorLogDialog + if Preferences.getUI("CheckErrorLog"): logFile = os.path.join(Utilities.getConfigDir(), self.ErrorLogFileName) if os.path.exists(logFile): - from .ErrorLogDialog import ErrorLogDialog - dlg = ErrorLogDialog(logFile, False, self) dlg.exec() @@ -4794,10 +4702,10 @@ """ Private slot to show the most recent error log message. """ + from .ErrorLogDialog import ErrorLogDialog + logFile = os.path.join(Utilities.getConfigDir(), self.ErrorLogFileName) if os.path.exists(logFile): - from .ErrorLogDialog import ErrorLogDialog - dlg = ErrorLogDialog(logFile, True, self) dlg.show() @@ -4816,11 +4724,11 @@ """ Private slot to handle the Compare Files dialog. """ + from .DiffDialog import DiffDialog + aw = self.viewmanager.activeWindow() fn = aw and aw.getFileName() or None if self.diffDlg is None: - from .DiffDialog import DiffDialog - self.diffDlg = DiffDialog() self.diffDlg.show(fn) @@ -4828,11 +4736,11 @@ """ Private slot to handle the Compare Files dialog. """ + from .CompareDialog import CompareDialog + aw = self.viewmanager.activeWindow() fn = aw and aw.getFileName() or None if self.compareDlg is None: - from .CompareDialog import CompareDialog - self.compareDlg = CompareDialog() self.compareDlg.show(fn) @@ -5673,11 +5581,11 @@ Private slot to handle the activation of the Shell window. """ if self.__layoutType == "Toolboxes": - self.__shellParent.show() - self.__shellParent.widget().setCurrentWidget(self.shellAssembly) + self.hToolboxDock.show() + self.hToolboxDock.setCurrentWidget(self.shellAssembly) elif self.__layoutType == "Sidebars": - self.__shellParent.show() - self.__shellParent.setCurrentWidget(self.shellAssembly) + self.bottomSidebar.show() + self.bottomSidebar.setCurrentWidget(self.shellAssembly) self.shell.setFocus(Qt.FocusReason.ActiveWindowFocusReason) def __activateLogViewer(self): @@ -5967,9 +5875,9 @@ """ Private slot to generate the testing dialog on demand. """ + from eric7.Testing.TestingWidget import TestingWidget + if self.__testingWidget is None: - from eric7.Testing.TestingWidget import TestingWidget - self.__testingWidget = TestingWidget() self.__testingWidget.testFile.connect(self.viewmanager.setFileLine) self.__testingWidget.testRunStopped.connect(self.__testingStopped) @@ -7164,10 +7072,10 @@ @param pageName name of the configuration page to show (string) """ + from eric7.Preferences.ConfigurationDialog import ConfigurationDialog + if self.__configurationDialog is None: # only one invocation at a time is allowed - from eric7.Preferences.ConfigurationDialog import ConfigurationDialog - self.__configurationDialog = ConfigurationDialog( self, "Configuration", @@ -7243,6 +7151,8 @@ """ Private slot to handle a change of the preferences. """ + from eric7.HexEdit.HexEditMainWindow import HexEditMainWindow + self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet")) if Preferences.getUI("SingleApplicationMode"): @@ -7279,14 +7189,14 @@ self.performVersionCheck() - from eric7.QScintilla.SpellChecker import SpellChecker - SpellChecker.setDefaultLanguage( Preferences.getEditor("SpellCheckingDefaultLanguage") ) with contextlib.suppress(ImportError, AttributeError): - from eric7.EricWidgets.EricSpellCheckedTextEdit import SpellCheckMixin + from eric7.EricWidgets.EricSpellCheckedTextEdit import ( # __IGNORE_WARNING__ + SpellCheckMixin, + ) pwl = SpellChecker.getUserDictionaryPath(isException=False) pel = SpellChecker.getUserDictionaryPath(isException=True) @@ -7301,8 +7211,6 @@ QNetworkProxyFactory.setApplicationProxyFactory(self.__proxyFactory) QNetworkProxyFactory.setUseSystemConfiguration(False) - from eric7.HexEdit.HexEditMainWindow import HexEditMainWindow - for hexEditor in HexEditMainWindow.windows: hexEditor.preferencesChanged() @@ -7334,7 +7242,9 @@ Preferences.convertPasswords(oldPassword, newPassword) variant = Globals.getWebBrowserSupport() if variant == "QtWebEngine": - from eric7.WebBrowser.Passwords.PasswordManager import PasswordManager + from eric7.WebBrowser.Passwords.PasswordManager import ( # __IGNORE_WARNING__ + PasswordManager, + ) pwManager = PasswordManager() pwManager.masterPasswordChanged(oldPassword, newPassword) @@ -7351,9 +7261,9 @@ Private slot to display a dialog show a list of external tools used by eric. """ + from eric7.Preferences.ProgramsDialog import ProgramsDialog + if self.programsDialog is None: - from eric7.Preferences.ProgramsDialog import ProgramsDialog - self.programsDialog = ProgramsDialog(self) self.programsDialog.show() @@ -7390,9 +7300,9 @@ """ Private slot to configure the keyboard shortcuts. """ + from eric7.Preferences.ShortcutsDialog import ShortcutsDialog + if self.shortcutsDialog is None: - from eric7.Preferences.ShortcutsDialog import ShortcutsDialog - self.shortcutsDialog = ShortcutsDialog(self) self.shortcutsDialog.populate() self.shortcutsDialog.show() @@ -7433,8 +7343,6 @@ ) if ok: - from eric7.Preferences import Shortcuts - Shortcuts.exportShortcuts(str(fpath)) def __importShortcuts(self): @@ -7451,8 +7359,6 @@ ) if fn: - from eric7.Preferences import Shortcuts - Shortcuts.importShortcuts(fn) def __showCertificatesDialog(self): @@ -7504,8 +7410,6 @@ if testing: # clear the unit test histories if self.__testingWidget is None: - from eric7.Testing.TestingWidget import clearSavedHistories - clearSavedHistories() else: self.__testingWidget.clearRecent() @@ -7580,14 +7484,15 @@ """ self.wizardsMenuAct.setEnabled(len(self.__menus["wizards"].actions()) > 0) - if fn and str(fn) != "None": - from eric7 import Testing - - if Testing.isLanguageSupported( + if ( + fn + and str(fn) != "None" + and Testing.isLanguageSupported( self.viewmanager.getOpenEditor(fn).getFileType() - ): - self.testScriptAct.setEnabled(True) - self.__testingEditorOpen = True + ) + ): + self.testScriptAct.setEnabled(True) + self.__testingEditorOpen = True def __checkActions(self, editor): """ @@ -7597,13 +7502,10 @@ """ fn = editor.getFileName() if editor else None - if fn: - from eric7 import Testing - - if Testing.isLanguageSupported(editor.getFileType()): - self.testScriptAct.setEnabled(True) - self.__testingEditorOpen = True - return + if fn and Testing.isLanguageSupported(editor.getFileType()): + self.testScriptAct.setEnabled(True) + self.__testingEditorOpen = True + return self.testScriptAct.setEnabled(False) @@ -7628,8 +7530,6 @@ if os.path.exists(fn): f = QFile(fn) if f.open(QIODevice.OpenModeFlag.ReadOnly): - from eric7.EricXML.TasksReader import TasksReader - reader = TasksReader(f, viewer=self.taskViewer) reader.readXML() f.close() @@ -7698,8 +7598,6 @@ # old XML based format f = QFile(fn) if f.open(QIODevice.OpenModeFlag.ReadOnly): - from eric7.EricXML.SessionReader import SessionReader - self.__readingSession = True reader = SessionReader(f, True) reader.readXML() @@ -7812,9 +7710,9 @@ """ Public slot to show the Find File by Name dialog. """ + from .FindFileNameDialog import FindFileNameDialog + if self.findFileNameDialog is None: - from .FindFileNameDialog import FindFileNameDialog - self.findFileNameDialog = FindFileNameDialog(self.project) self.findFileNameDialog.sourceFile.connect(self.viewmanager.openSourceFile) self.findFileNameDialog.designerFile.connect(self.__designer) @@ -7834,6 +7732,8 @@ (defaults to False) @type bool (optional) """ + from .FindFileWidget import FindFileDialog + if Preferences.getUI("ShowFindFileWidget"): # embedded tool self.__activateFindFileWidget() @@ -7843,8 +7743,6 @@ 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 @@ -7871,6 +7769,8 @@ (defaults to False) @type bool (optional) """ + from .FindFileWidget import FindFileDialog + if Preferences.getUI("ShowFindFileWidget"): # embedded tool self.__activateFindFileWidget() @@ -7880,8 +7780,6 @@ 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 @@ -7914,14 +7812,14 @@ """ Public method to show the Find File widget. """ + from .FindLocationWidget import FindLocationDialog + if Preferences.getUI("ShowFindLocationWidget"): # embedded tool self.__activateFindLocationWidget() else: # external dialog if self.__findLocationDialog is None: - from .FindLocationWidget import FindLocationDialog - self.__findLocationDialog = FindLocationDialog(self.project, self) self.__findLocationDialog.sourceFile.connect( self.viewmanager.openSourceFile @@ -8191,10 +8089,14 @@ Private method to perform all necessary steps to close down the IDE. @return flag indicating success + @rtype bool """ if self.shutdownCalled: return True + if not self.viewmanager.checkAllDirty(): + return False + if self.__webBrowserProcess is not None: self.__webBrowserShutdown() @@ -8534,9 +8436,9 @@ (None = use configured timeout, 0 = indefinitely) @type int """ + from .NotificationWidget import NotificationWidget + if self.__notification is None: - from .NotificationWidget import NotificationWidget - self.__notification = NotificationWidget(parent=self) if timeout is None: timeout = Preferences.getUI("NotificationTimeout")