src/eric7/Project/ProjectBrowser.py

branch
eric7
changeset 9512
6e29913ba7b6
parent 9482
a2bc06a54d9d
child 9517
d73c3a1e432b
equal deleted inserted replaced
9511:263a664d55dc 9512:6e29913ba7b6
5 5
6 """ 6 """
7 Module implementing the project browser part of the eric UI. 7 Module implementing the project browser part of the eric UI.
8 """ 8 """
9 9
10 from PyQt6.QtCore import Qt 10 from PyQt6.QtCore import Qt, pyqtSignal
11 from PyQt6.QtGui import QColor 11 from PyQt6.QtGui import QColor
12 from PyQt6.QtWidgets import QApplication 12 from PyQt6.QtWidgets import QApplication
13 13
14 from eric7 import Preferences 14 from eric7 import Preferences
15 from eric7.EricGui import EricPixmapCache 15 from eric7.EricGui import EricPixmapCache
43 the project sources browser, the project forms browser, 43 the project sources browser, the project forms browser,
44 the project resources browser, the project translations browser, 44 the project resources browser, the project translations browser,
45 the project interfaces (IDL) browser and a browser for stuff, 45 the project interfaces (IDL) browser and a browser for stuff,
46 that doesn't fit these categories. Optionally it contains an additional 46 that doesn't fit these categories. Optionally it contains an additional
47 tab with the file system browser. 47 tab with the file system browser.
48
49 Note: The following signals are defined here to proxy the individual browser
50 signals.
51
52 @signal appendStderr(str) emitted after something was received from
53 a QProcess on stderr
54 @signal appendStdout(str) emitted after something was received from
55 a QProcess on stdout
56 @signal binaryFile(filename) emitted to open a file as binary (str)
57 @signal closeSourceWindow(str) emitted to close a source file
58 @signal designerFile(filename) emitted to open a Qt-Designer file (str)
59 @signal linguistFile(filename) emitted to open a Qt-Linguist (*.ts)
60 file (str)
61 @signal pixmapEditFile(filename) emitted to edit a pixmap file (str)
62 @signal pixmapFile(filename) emitted to open a pixmap file (str)
63 @signal preferencesChanged() emitted when the preferences have been changed
64 @signal sourceFile(filename) emitted to open a Python file at a line (str)
65 @signal sourceFile(filename, lineno) emitted to open a Python file at a
66 line (str, int)
67 @signal sourceFile(filename, lineno, type) emitted to open a Python file
68 at a line giving an explicit file type (str, int, str)
69 @signal sourceFile(filename, linenos) emitted to open a Python file giving
70 a list of lines(str, list)
71 @signal svgFile(filename) emitted to open a SVG file (str)
72 @signal testFile(filename) emitted to open a Python file for a
73 unit test (str)
74 @signal trpreview(filenames) emitted to preview Qt-Linguist (*.qm)
75 files (list of str)
76 @signal trpreview(filenames, ignore) emitted to preview Qt-Linguist (*.qm)
77 files indicating whether non-existent files shall be ignored
78 (list of str, bool)
79 @signal uipreview(str) emitted to preview a forms file
80 @signal umlFile(filename) emitted to open an eric UML file (str)
48 """ 81 """
82
83 appendStderr = pyqtSignal(str)
84 appendStdout = pyqtSignal(str)
85 binaryFile = pyqtSignal(str)
86 closeSourceWindow = pyqtSignal(str)
87 designerFile = pyqtSignal(str)
88 linguistFile = pyqtSignal(str)
89 pixmapEditFile = pyqtSignal(str)
90 pixmapFile = pyqtSignal(str)
91 preferencesChanged = pyqtSignal()
92 sourceFile = pyqtSignal((str,), (str, int), (str, list), (str, int, str))
93 svgFile = pyqtSignal(str)
94 testFile = pyqtSignal(str)
95 trpreview = pyqtSignal((list,), (list, bool))
96 uipreview = pyqtSignal(str)
97 umlFile = pyqtSignal(str)
49 98
50 def __init__(self, project, parent=None): 99 def __init__(self, project, parent=None):
51 """ 100 """
52 Constructor 101 Constructor
53 102
81 "U": self.tr("update required"), 130 "U": self.tr("update required"),
82 "Z": self.tr("conflict"), 131 "Z": self.tr("conflict"),
83 } 132 }
84 self.__vcsStateChanged(" ") 133 self.__vcsStateChanged(" ")
85 134
86 # step 1: create all the individual browsers 135 # create all the individual browsers
87 # sources browser 136 self.__browsers = {
88 self.psBrowser = ProjectSourcesBrowser(self.project) 137 # sources browser
89 # forms browser 138 "sources": ProjectSourcesBrowser(self.project, self),
90 self.pfBrowser = ProjectFormsBrowser(self.project) 139 # forms browser
91 # resources browser 140 "forms": ProjectFormsBrowser(self.project, self),
92 self.prBrowser = ProjectResourcesBrowser(self.project) 141 # resources browser
93 # translations browser 142 "resources": ProjectResourcesBrowser(self.project, self),
94 self.ptBrowser = ProjectTranslationsBrowser(self.project) 143 # translations browser
95 # interfaces (IDL) browser 144 "translations": ProjectTranslationsBrowser(self.project, self),
96 self.piBrowser = ProjectInterfacesBrowser(self.project) 145 # others browser
97 # protocols (protobuf) browser 146 "others": ProjectOthersBrowser(self.project, self),
98 self.ppBrowser = ProjectProtocolsBrowser(self.project) 147 # interfaces (IDL) browser
99 # others browser 148 "interfaces": ProjectInterfacesBrowser(self.project, self),
100 self.poBrowser = ProjectOthersBrowser(self.project) 149 # protocols (protobuf) browser
101 150 "protocols": ProjectProtocolsBrowser(self.project, self),
102 # step 2: connect all the browsers 151 }
103 # connect the sources browser
104 self.project.projectClosed.connect(self.psBrowser._projectClosed)
105 self.project.projectOpened.connect(self.psBrowser._projectOpened)
106 self.project.newProject.connect(self.psBrowser._newProject)
107 self.project.reinitVCS.connect(self.psBrowser._initMenusAndVcs)
108 self.project.projectPropertiesChanged.connect(self.psBrowser._initMenusAndVcs)
109
110 # connect the forms browser
111 self.project.projectClosed.connect(self.pfBrowser._projectClosed)
112 self.project.projectOpened.connect(self.pfBrowser._projectOpened)
113 self.project.newProject.connect(self.pfBrowser._newProject)
114 self.project.reinitVCS.connect(self.pfBrowser._initMenusAndVcs)
115 self.project.projectPropertiesChanged.connect(self.pfBrowser._initMenusAndVcs)
116
117 # connect the resources browser
118 self.project.projectClosed.connect(self.prBrowser._projectClosed)
119 self.project.projectOpened.connect(self.prBrowser._projectOpened)
120 self.project.newProject.connect(self.prBrowser._newProject)
121 self.project.reinitVCS.connect(self.prBrowser._initMenusAndVcs)
122 self.project.projectPropertiesChanged.connect(self.prBrowser._initMenusAndVcs)
123
124 # connect the translations browser
125 self.project.projectClosed.connect(self.ptBrowser._projectClosed)
126 self.project.projectOpened.connect(self.ptBrowser._projectOpened)
127 self.project.newProject.connect(self.ptBrowser._newProject)
128 self.project.reinitVCS.connect(self.ptBrowser._initMenusAndVcs)
129 self.project.projectPropertiesChanged.connect(self.ptBrowser._initMenusAndVcs)
130
131 # connect the interfaces (IDL) browser
132 self.project.projectClosed.connect(self.piBrowser._projectClosed)
133 self.project.projectOpened.connect(self.piBrowser._projectOpened)
134 self.project.newProject.connect(self.piBrowser._newProject)
135 self.project.reinitVCS.connect(self.piBrowser._initMenusAndVcs)
136 self.project.projectPropertiesChanged.connect(self.piBrowser._initMenusAndVcs)
137
138 # connect the protocols (protobuf) browser
139 self.project.projectClosed.connect(self.ppBrowser._projectClosed)
140 self.project.projectOpened.connect(self.ppBrowser._projectOpened)
141 self.project.newProject.connect(self.ppBrowser._newProject)
142 self.project.reinitVCS.connect(self.ppBrowser._initMenusAndVcs)
143 self.project.projectPropertiesChanged.connect(self.ppBrowser._initMenusAndVcs)
144
145 # connect the others browser
146 self.project.projectClosed.connect(self.poBrowser._projectClosed)
147 self.project.projectOpened.connect(self.poBrowser._projectOpened)
148 self.project.newProject.connect(self.poBrowser._newProject)
149 self.project.reinitVCS.connect(self.poBrowser._initMenusAndVcs)
150 self.project.projectPropertiesChanged.connect(self.poBrowser._initMenusAndVcs)
151 152
152 # add signal connection to ourselves 153 # add signal connection to ourselves
153 self.project.projectOpened.connect(self.__projectOpened) 154 self.project.projectOpened.connect(self.__projectOpened)
154 self.project.projectClosed.connect(self.__projectClosed) 155 self.project.projectClosed.connect(self.__projectClosed)
155 self.project.newProject.connect(self.__newProject) 156 self.project.newProject.connect(self.__newProject)
172 self.removeTab(0) 173 self.removeTab(0)
173 174
174 # step 2: add browsers 175 # step 2: add browsers
175 if browserFlags & SourcesBrowserFlag: 176 if browserFlags & SourcesBrowserFlag:
176 index = self.addTab( 177 index = self.addTab(
177 self.psBrowser, EricPixmapCache.getIcon("projectSources"), "" 178 self.__browsers["sources"],
178 ) 179 EricPixmapCache.getIcon("projectSources"),
179 self.setTabToolTip(index, self.psBrowser.windowTitle()) 180 "",
181 )
182 self.setTabToolTip(index, self.__browsers["sources"].windowTitle())
180 183
181 if browserFlags & FormsBrowserFlag: 184 if browserFlags & FormsBrowserFlag:
182 index = self.addTab( 185 index = self.addTab(
183 self.pfBrowser, EricPixmapCache.getIcon("projectForms"), "" 186 self.__browsers["forms"], EricPixmapCache.getIcon("projectForms"), ""
184 ) 187 )
185 self.setTabToolTip(index, self.pfBrowser.windowTitle()) 188 self.setTabToolTip(index, self.__browsers["forms"].windowTitle())
186 189
187 if browserFlags & ResourcesBrowserFlag: 190 if browserFlags & ResourcesBrowserFlag:
188 index = self.addTab( 191 index = self.addTab(
189 self.prBrowser, EricPixmapCache.getIcon("projectResources"), "" 192 self.__browsers["resources"],
190 ) 193 EricPixmapCache.getIcon("projectResources"),
191 self.setTabToolTip(index, self.prBrowser.windowTitle()) 194 "",
195 )
196 self.setTabToolTip(index, self.__browsers["resources"].windowTitle())
192 197
193 if browserFlags & TranslationsBrowserFlag: 198 if browserFlags & TranslationsBrowserFlag:
194 index = self.addTab( 199 index = self.addTab(
195 self.ptBrowser, EricPixmapCache.getIcon("projectTranslations"), "" 200 self.__browsers["translations"],
196 ) 201 EricPixmapCache.getIcon("projectTranslations"),
197 self.setTabToolTip(index, self.ptBrowser.windowTitle()) 202 "",
203 )
204 self.setTabToolTip(index, self.__browsers["translations"].windowTitle())
198 205
199 if browserFlags & InterfacesBrowserFlag: 206 if browserFlags & InterfacesBrowserFlag:
200 index = self.addTab( 207 index = self.addTab(
201 self.piBrowser, EricPixmapCache.getIcon("projectInterfaces"), "" 208 self.__browsers["interfaces"],
202 ) 209 EricPixmapCache.getIcon("projectInterfaces"),
203 self.setTabToolTip(index, self.piBrowser.windowTitle()) 210 "",
211 )
212 self.setTabToolTip(index, self.__browsers["interfaces"].windowTitle())
204 213
205 if browserFlags & ProtocolsBrowserFlag: 214 if browserFlags & ProtocolsBrowserFlag:
206 index = self.addTab(self.ppBrowser, EricPixmapCache.getIcon("protobuf"), "") 215 index = self.addTab(
207 self.setTabToolTip(index, self.ppBrowser.windowTitle()) 216 self.__browsers["protocols"], EricPixmapCache.getIcon("protobuf"), ""
217 )
218 self.setTabToolTip(index, self.__browsers["protocols"].windowTitle())
208 219
209 if browserFlags & OthersBrowserFlag: 220 if browserFlags & OthersBrowserFlag:
210 index = self.addTab( 221 index = self.addTab(
211 self.poBrowser, EricPixmapCache.getIcon("projectOthers"), "" 222 self.__browsers["others"], EricPixmapCache.getIcon("projectOthers"), ""
212 ) 223 )
213 self.setTabToolTip(index, self.poBrowser.windowTitle()) 224 self.setTabToolTip(index, self.__browsers["others"].windowTitle())
214 225
215 QApplication.processEvents() 226 QApplication.processEvents()
216 227
217 def __currentChanged(self, index): 228 def __currentChanged(self, index):
218 """ 229 """
290 icon = EricPixmapCache.getIcon("projectSourcesRb") 301 icon = EricPixmapCache.getIcon("projectSourcesRb")
291 elif self.project.getProjectLanguage() == "JavaScript": 302 elif self.project.getProjectLanguage() == "JavaScript":
292 icon = EricPixmapCache.getIcon("projectSourcesJavaScript") 303 icon = EricPixmapCache.getIcon("projectSourcesJavaScript")
293 else: 304 else:
294 icon = EricPixmapCache.getIcon("projectSources") 305 icon = EricPixmapCache.getIcon("projectSources")
295 self.setTabIcon(self.indexOf(self.psBrowser), icon) 306 self.setTabIcon(self.indexOf(self.__browsers["sources"]), icon)
296 307
297 def handleEditorChanged(self, fn): 308 def handleEditorChanged(self, fn):
298 """ 309 """
299 Public slot to handle the editorChanged signal. 310 Public slot to handle the editorChanged signal.
300 311
301 @param fn filename of the changed file (string) 312 @param fn filename of the changed file (string)
302 """ 313 """
303 if Preferences.getProject("FollowEditor"): 314 if Preferences.getProject("FollowEditor"):
304 if self.project.isProjectSource(fn): 315 if self.project.isProjectSource(fn):
305 self.psBrowser.selectFile(fn) 316 self.__browsers["sources"].selectFile(fn)
306 elif self.project.isProjectForm(fn): 317 elif self.project.isProjectForm(fn):
307 self.pfBrowser.selectFile(fn) 318 self.__browsers["forms"].selectFile(fn)
308 elif self.project.isProjectResource(fn): 319 elif self.project.isProjectResource(fn):
309 self.prBrowser.selectFile(fn) 320 self.__browsers["resources"].selectFile(fn)
310 elif self.project.isProjectInterface(fn): 321 elif self.project.isProjectInterface(fn):
311 self.piBrowser.selectFile(fn) 322 self.__browsers["interfaces"].selectFile(fn)
312 elif self.project.isProjectProtocol(fn): 323 elif self.project.isProjectProtocol(fn):
313 self.ppBrowser.selectFile(fn) 324 self.__browsers["protocols"].selectFile(fn)
314 325
315 def handleEditorLineChanged(self, fn, lineno): 326 def handleEditorLineChanged(self, fn, lineno):
316 """ 327 """
317 Public slot to handle the editorLineChanged signal. 328 Public slot to handle the editorLineChanged signal.
318 329
322 if ( 333 if (
323 Preferences.getProject("FollowEditor") 334 Preferences.getProject("FollowEditor")
324 and Preferences.getProject("FollowCursorLine") 335 and Preferences.getProject("FollowCursorLine")
325 and self.project.isProjectSource(fn) 336 and self.project.isProjectSource(fn)
326 ): 337 ):
327 self.psBrowser.selectFileLine(fn, lineno) 338 self.__browsers["sources"].selectFileLine(fn, lineno)
328 339
329 def getProjectBrowsers(self): 340 def getProjectBrowsers(self):
330 """ 341 """
331 Public method to get references to the individual project browsers. 342 Public method to get references to the individual project browsers.
332 343
333 @return list of references to project browsers 344 @return list of references to project browsers
334 """ 345 @rtype list of ProjectBaseBrowser
335 return [ 346 """
336 self.psBrowser, 347 return list(self.__browsers.items())
337 self.pfBrowser,
338 self.prBrowser,
339 self.ptBrowser,
340 self.piBrowser,
341 self.ppBrowser,
342 self.poBrowser,
343 ]
344 348
345 def getProjectBrowser(self, name): 349 def getProjectBrowser(self, name):
346 """ 350 """
347 Public method to get a reference to the named project browser. 351 Public method to get a reference to the named project browser.
348 352
349 @param name name of the requested project browser (string). 353 @param name name of the requested project browser.
350 Valid names are "sources, forms, resources, translations, 354 @type str
351 interfaces, protocols, others".
352 @return reference to the requested browser or None 355 @return reference to the requested browser or None
353 """ 356 @rtype ProjectBaseBrowser or None
354 return { 357 """
355 "sources": self.psBrowser, 358 return self.__browsers.get(name, None)
356 "forms": self.pfBrowser,
357 "resources": self.prBrowser,
358 "translations": self.ptBrowser,
359 "interfaces": self.piBrowser,
360 "protocols": self.ppBrowser,
361 "others": self.poBrowser,
362 }.get(name, None)
363 359
364 def getProjectBrowserNames(self): 360 def getProjectBrowserNames(self):
365 """ 361 """
366 Public method to get the names of the various project browsers. 362 Public method to get the names of the various project browsers.
367 363
368 @return list of project browser names (list of string) 364 @return list of project browser names
369 """ 365 @rtype list of str
370 return [ 366 """
371 "sources", 367 return list(self.__browsers.keys())
372 "forms",
373 "resources",
374 "translations",
375 "interfaces",
376 "protocols",
377 "others",
378 ]
379 368
380 def handlePreferencesChanged(self): 369 def handlePreferencesChanged(self):
381 """ 370 """
382 Public slot used to handle the preferencesChanged signal. 371 Public slot used to handle the preferencesChanged signal.
383 """ 372 """
384 self.__projectPropertiesChanged() 373 self.__projectPropertiesChanged()
385 self.__vcsStateChanged(self.currentVcsStatus) 374 self.__vcsStateChanged(self.currentVcsStatus)
375
376 self.preferencesChanged.emit() # propagate the signal to the browsers
386 377
387 def __vcsStateChanged(self, state): 378 def __vcsStateChanged(self, state):
388 """ 379 """
389 Private slot to handle a change in the vcs state. 380 Private slot to handle a change in the vcs state.
390 381

eric ide

mercurial