src/eric7/UI/UserInterface.py

branch
eric7-maintenance
changeset 9549
67295777d9fe
parent 9449
c982bacca23f
parent 9548
2d2a91757852
child 9554
fe8c29d7cf96
--- 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")

eric ide

mercurial