src/eric7/Project/ProjectBrowser.py

branch
eric7
changeset 9512
6e29913ba7b6
parent 9482
a2bc06a54d9d
child 9517
d73c3a1e432b
diff -r 263a664d55dc -r 6e29913ba7b6 src/eric7/Project/ProjectBrowser.py
--- a/src/eric7/Project/ProjectBrowser.py	Mon Nov 14 11:33:53 2022 +0100
+++ b/src/eric7/Project/ProjectBrowser.py	Tue Nov 15 11:06:27 2022 +0100
@@ -7,7 +7,7 @@
 Module implementing the project browser part of the eric UI.
 """
 
-from PyQt6.QtCore import Qt
+from PyQt6.QtCore import Qt, pyqtSignal
 from PyQt6.QtGui import QColor
 from PyQt6.QtWidgets import QApplication
 
@@ -45,8 +45,57 @@
     the project interfaces (IDL) browser and a browser for stuff,
     that doesn't fit these categories. Optionally it contains an additional
     tab with the file system browser.
+
+    Note: The following signals are defined here to proxy the individual browser
+    signals.
+
+    @signal appendStderr(str) emitted after something was received from
+        a QProcess on stderr
+    @signal appendStdout(str) emitted after something was received from
+        a QProcess on stdout
+    @signal binaryFile(filename) emitted to open a file as binary (str)
+    @signal closeSourceWindow(str) emitted to close a source file
+    @signal designerFile(filename) emitted to open a Qt-Designer file (str)
+    @signal linguistFile(filename) emitted to open a Qt-Linguist (*.ts)
+        file (str)
+    @signal pixmapEditFile(filename) emitted to edit a pixmap file (str)
+    @signal pixmapFile(filename) emitted to open a pixmap file (str)
+    @signal preferencesChanged() emitted when the preferences have been changed
+    @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)
+    @signal sourceFile(filename, lineno, type) emitted to open a Python file
+        at a line giving an explicit file type (str, int, str)
+    @signal sourceFile(filename, linenos) emitted to open a Python file giving
+        a list of lines(str, list)
+    @signal svgFile(filename) emitted to open a SVG file (str)
+    @signal testFile(filename) emitted to open a Python file for a
+        unit test (str)
+    @signal trpreview(filenames) emitted to preview Qt-Linguist (*.qm)
+        files (list of str)
+    @signal trpreview(filenames, ignore) emitted to preview Qt-Linguist (*.qm)
+        files indicating whether non-existent files shall be ignored
+        (list of str, bool)
+    @signal uipreview(str) emitted to preview a forms file
+    @signal umlFile(filename) emitted to open an eric UML file (str)
     """
 
+    appendStderr = pyqtSignal(str)
+    appendStdout = pyqtSignal(str)
+    binaryFile = pyqtSignal(str)
+    closeSourceWindow = pyqtSignal(str)
+    designerFile = pyqtSignal(str)
+    linguistFile = pyqtSignal(str)
+    pixmapEditFile = pyqtSignal(str)
+    pixmapFile = pyqtSignal(str)
+    preferencesChanged = pyqtSignal()
+    sourceFile = pyqtSignal((str,), (str, int), (str, list), (str, int, str))
+    svgFile = pyqtSignal(str)
+    testFile = pyqtSignal(str)
+    trpreview = pyqtSignal((list,), (list, bool))
+    uipreview = pyqtSignal(str)
+    umlFile = pyqtSignal(str)
+
     def __init__(self, project, parent=None):
         """
         Constructor
@@ -83,71 +132,23 @@
         }
         self.__vcsStateChanged(" ")
 
-        # step 1: create all the individual browsers
-        # sources browser
-        self.psBrowser = ProjectSourcesBrowser(self.project)
-        # forms browser
-        self.pfBrowser = ProjectFormsBrowser(self.project)
-        # resources browser
-        self.prBrowser = ProjectResourcesBrowser(self.project)
-        # translations browser
-        self.ptBrowser = ProjectTranslationsBrowser(self.project)
-        # interfaces (IDL) browser
-        self.piBrowser = ProjectInterfacesBrowser(self.project)
-        # protocols (protobuf) browser
-        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)
-
-        # 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)
-
-        # 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)
-
-        # 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)
-
-        # 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)
-
-        # 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)
-
-        # 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)
+        # create all the individual browsers
+        self.__browsers = {
+            # sources browser
+            "sources": ProjectSourcesBrowser(self.project, self),
+            # forms browser
+            "forms": ProjectFormsBrowser(self.project, self),
+            # resources browser
+            "resources": ProjectResourcesBrowser(self.project, self),
+            # translations browser
+            "translations": ProjectTranslationsBrowser(self.project, self),
+            # others browser
+            "others": ProjectOthersBrowser(self.project, self),
+            # interfaces (IDL) browser
+            "interfaces": ProjectInterfacesBrowser(self.project, self),
+            # protocols (protobuf) browser
+            "protocols": ProjectProtocolsBrowser(self.project, self),
+        }
 
         # add signal connection to ourselves
         self.project.projectOpened.connect(self.__projectOpened)
@@ -174,43 +175,53 @@
         # step 2: add browsers
         if browserFlags & SourcesBrowserFlag:
             index = self.addTab(
-                self.psBrowser, EricPixmapCache.getIcon("projectSources"), ""
+                self.__browsers["sources"],
+                EricPixmapCache.getIcon("projectSources"),
+                "",
             )
-            self.setTabToolTip(index, self.psBrowser.windowTitle())
+            self.setTabToolTip(index, self.__browsers["sources"].windowTitle())
 
         if browserFlags & FormsBrowserFlag:
             index = self.addTab(
-                self.pfBrowser, EricPixmapCache.getIcon("projectForms"), ""
+                self.__browsers["forms"], EricPixmapCache.getIcon("projectForms"), ""
             )
-            self.setTabToolTip(index, self.pfBrowser.windowTitle())
+            self.setTabToolTip(index, self.__browsers["forms"].windowTitle())
 
         if browserFlags & ResourcesBrowserFlag:
             index = self.addTab(
-                self.prBrowser, EricPixmapCache.getIcon("projectResources"), ""
+                self.__browsers["resources"],
+                EricPixmapCache.getIcon("projectResources"),
+                "",
             )
-            self.setTabToolTip(index, self.prBrowser.windowTitle())
+            self.setTabToolTip(index, self.__browsers["resources"].windowTitle())
 
         if browserFlags & TranslationsBrowserFlag:
             index = self.addTab(
-                self.ptBrowser, EricPixmapCache.getIcon("projectTranslations"), ""
+                self.__browsers["translations"],
+                EricPixmapCache.getIcon("projectTranslations"),
+                "",
             )
-            self.setTabToolTip(index, self.ptBrowser.windowTitle())
+            self.setTabToolTip(index, self.__browsers["translations"].windowTitle())
 
         if browserFlags & InterfacesBrowserFlag:
             index = self.addTab(
-                self.piBrowser, EricPixmapCache.getIcon("projectInterfaces"), ""
+                self.__browsers["interfaces"],
+                EricPixmapCache.getIcon("projectInterfaces"),
+                "",
             )
-            self.setTabToolTip(index, self.piBrowser.windowTitle())
+            self.setTabToolTip(index, self.__browsers["interfaces"].windowTitle())
 
         if browserFlags & ProtocolsBrowserFlag:
-            index = self.addTab(self.ppBrowser, EricPixmapCache.getIcon("protobuf"), "")
-            self.setTabToolTip(index, self.ppBrowser.windowTitle())
+            index = self.addTab(
+                self.__browsers["protocols"], EricPixmapCache.getIcon("protobuf"), ""
+            )
+            self.setTabToolTip(index, self.__browsers["protocols"].windowTitle())
 
         if browserFlags & OthersBrowserFlag:
             index = self.addTab(
-                self.poBrowser, EricPixmapCache.getIcon("projectOthers"), ""
+                self.__browsers["others"], EricPixmapCache.getIcon("projectOthers"), ""
             )
-            self.setTabToolTip(index, self.poBrowser.windowTitle())
+            self.setTabToolTip(index, self.__browsers["others"].windowTitle())
 
         QApplication.processEvents()
 
@@ -292,7 +303,7 @@
                 icon = EricPixmapCache.getIcon("projectSourcesJavaScript")
             else:
                 icon = EricPixmapCache.getIcon("projectSources")
-        self.setTabIcon(self.indexOf(self.psBrowser), icon)
+        self.setTabIcon(self.indexOf(self.__browsers["sources"]), icon)
 
     def handleEditorChanged(self, fn):
         """
@@ -302,15 +313,15 @@
         """
         if Preferences.getProject("FollowEditor"):
             if self.project.isProjectSource(fn):
-                self.psBrowser.selectFile(fn)
+                self.__browsers["sources"].selectFile(fn)
             elif self.project.isProjectForm(fn):
-                self.pfBrowser.selectFile(fn)
+                self.__browsers["forms"].selectFile(fn)
             elif self.project.isProjectResource(fn):
-                self.prBrowser.selectFile(fn)
+                self.__browsers["resources"].selectFile(fn)
             elif self.project.isProjectInterface(fn):
-                self.piBrowser.selectFile(fn)
+                self.__browsers["interfaces"].selectFile(fn)
             elif self.project.isProjectProtocol(fn):
-                self.ppBrowser.selectFile(fn)
+                self.__browsers["protocols"].selectFile(fn)
 
     def handleEditorLineChanged(self, fn, lineno):
         """
@@ -324,58 +335,36 @@
             and Preferences.getProject("FollowCursorLine")
             and self.project.isProjectSource(fn)
         ):
-            self.psBrowser.selectFileLine(fn, lineno)
+            self.__browsers["sources"].selectFileLine(fn, lineno)
 
     def getProjectBrowsers(self):
         """
         Public method to get references to the individual project browsers.
 
         @return list of references to project browsers
+        @rtype list of ProjectBaseBrowser
         """
-        return [
-            self.psBrowser,
-            self.pfBrowser,
-            self.prBrowser,
-            self.ptBrowser,
-            self.piBrowser,
-            self.ppBrowser,
-            self.poBrowser,
-        ]
+        return list(self.__browsers.items())
 
     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".
+        @param name name of the requested project browser.
+        @type str
         @return reference to the requested browser or None
+        @rtype ProjectBaseBrowser or None
         """
-        return {
-            "sources": self.psBrowser,
-            "forms": self.pfBrowser,
-            "resources": self.prBrowser,
-            "translations": self.ptBrowser,
-            "interfaces": self.piBrowser,
-            "protocols": self.ppBrowser,
-            "others": self.poBrowser,
-        }.get(name, None)
+        return self.__browsers.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 list of project browser names
+        @rtype list of str
         """
-        return [
-            "sources",
-            "forms",
-            "resources",
-            "translations",
-            "interfaces",
-            "protocols",
-            "others",
-        ]
+        return list(self.__browsers.keys())
 
     def handlePreferencesChanged(self):
         """
@@ -384,6 +373,8 @@
         self.__projectPropertiesChanged()
         self.__vcsStateChanged(self.currentVcsStatus)
 
+        self.preferencesChanged.emit()  # propagate the signal to the browsers
+
     def __vcsStateChanged(self, state):
         """
         Private slot to handle a change in the vcs state.

eric ide

mercurial