--- 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.