src/eric7/Project/ProjectSourcesBrowser.py

branch
eric7
changeset 9221
bf71ee032bb4
parent 9217
0c34da0d7b76
child 9246
f3120bfe82fb
equal deleted inserted replaced
9220:e9e7eca7efee 9221:bf71ee032bb4
15 15
16 from EricWidgets import EricMessageBox 16 from EricWidgets import EricMessageBox
17 from EricWidgets.EricApplication import ericApp 17 from EricWidgets.EricApplication import ericApp
18 18
19 from UI.BrowserModel import ( 19 from UI.BrowserModel import (
20 BrowserFileItem, BrowserClassItem, BrowserMethodItem, 20 BrowserFileItem,
21 BrowserClassAttributeItem, BrowserImportItem 21 BrowserClassItem,
22 BrowserMethodItem,
23 BrowserClassAttributeItem,
24 BrowserImportItem,
22 ) 25 )
23 26
24 from .ProjectBrowserModel import ( 27 from .ProjectBrowserModel import (
25 ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem, 28 ProjectBrowserFileItem,
26 ProjectBrowserDirectoryItem, ProjectBrowserSourceType 29 ProjectBrowserSimpleDirectoryItem,
30 ProjectBrowserDirectoryItem,
31 ProjectBrowserSourceType,
27 ) 32 )
28 from .ProjectBaseBrowser import ProjectBaseBrowser 33 from .ProjectBaseBrowser import ProjectBaseBrowser
29 34
30 import Utilities 35 import Utilities
31 import UI.PixmapCache 36 import UI.PixmapCache
34 39
35 40
36 class ProjectSourcesBrowser(ProjectBaseBrowser): 41 class ProjectSourcesBrowser(ProjectBaseBrowser):
37 """ 42 """
38 A class used to display the Sources part of the project. 43 A class used to display the Sources part of the project.
39 44
40 @signal showMenu(str, QMenu) emitted when a menu is about to be shown. 45 @signal showMenu(str, QMenu) emitted when a menu is about to be shown.
41 The name of the menu and a reference to the menu are given. 46 The name of the menu and a reference to the menu are given.
42 """ 47 """
48
43 showMenu = pyqtSignal(str, QMenu) 49 showMenu = pyqtSignal(str, QMenu)
44 50
45 def __init__(self, project, parent=None): 51 def __init__(self, project, parent=None):
46 """ 52 """
47 Constructor 53 Constructor
48 54
49 @param project reference to the project object 55 @param project reference to the project object
50 @param parent parent widget of this browser (QWidget) 56 @param parent parent widget of this browser (QWidget)
51 """ 57 """
52 ProjectBaseBrowser.__init__(self, project, ProjectBrowserSourceType, 58 ProjectBaseBrowser.__init__(self, project, ProjectBrowserSourceType, parent)
53 parent) 59
54 60 self.selectedItemsFilter = [
55 self.selectedItemsFilter = [ProjectBrowserFileItem, 61 ProjectBrowserFileItem,
56 ProjectBrowserSimpleDirectoryItem] 62 ProjectBrowserSimpleDirectoryItem,
57 63 ]
58 self.setWindowTitle(self.tr('Sources')) 64
59 65 self.setWindowTitle(self.tr("Sources"))
60 self.setWhatsThis(self.tr( 66
61 """<b>Project Sources Browser</b>""" 67 self.setWhatsThis(
62 """<p>This allows to easily see all sources contained in the""" 68 self.tr(
63 """ current project. Several actions can be executed via the""" 69 """<b>Project Sources Browser</b>"""
64 """ context menu.</p>""" 70 """<p>This allows to easily see all sources contained in the"""
65 )) 71 """ current project. Several actions can be executed via the"""
66 72 """ context menu.</p>"""
73 )
74 )
75
67 project.prepareRepopulateItem.connect(self._prepareRepopulateItem) 76 project.prepareRepopulateItem.connect(self._prepareRepopulateItem)
68 project.completeRepopulateItem.connect(self._completeRepopulateItem) 77 project.completeRepopulateItem.connect(self._completeRepopulateItem)
69 78
70 self.codemetrics = None 79 self.codemetrics = None
71 self.codecoverage = None 80 self.codecoverage = None
72 self.profiledata = None 81 self.profiledata = None
73 self.classDiagram = None 82 self.classDiagram = None
74 self.importsDiagram = None 83 self.importsDiagram = None
75 self.packageDiagram = None 84 self.packageDiagram = None
76 self.applicationDiagram = None 85 self.applicationDiagram = None
77 self.loadedDiagram = None 86 self.loadedDiagram = None
78 87
79 def __closeAllWindows(self): 88 def __closeAllWindows(self):
80 """ 89 """
81 Private method to close all project related windows. 90 Private method to close all project related windows.
82 """ 91 """
83 self.codemetrics and self.codemetrics.close() 92 self.codemetrics and self.codemetrics.close()
86 self.classDiagram and self.classDiagram.close() 95 self.classDiagram and self.classDiagram.close()
87 self.importsDiagram and self.importsDiagram.close() 96 self.importsDiagram and self.importsDiagram.close()
88 self.packageDiagram and self.packageDiagram.close() 97 self.packageDiagram and self.packageDiagram.close()
89 self.applicationDiagram and self.applicationDiagram.close() 98 self.applicationDiagram and self.applicationDiagram.close()
90 self.loadedDiagram and self.loadedDiagram.close() 99 self.loadedDiagram and self.loadedDiagram.close()
91 100
92 def _projectClosed(self): 101 def _projectClosed(self):
93 """ 102 """
94 Protected slot to handle the projectClosed signal. 103 Protected slot to handle the projectClosed signal.
95 """ 104 """
96 self.__closeAllWindows() 105 self.__closeAllWindows()
97 ProjectBaseBrowser._projectClosed(self) 106 ProjectBaseBrowser._projectClosed(self)
98 107
99 def _createPopupMenus(self): 108 def _createPopupMenus(self):
100 """ 109 """
101 Protected overloaded method to generate the popup menu. 110 Protected overloaded method to generate the popup menu.
102 """ 111 """
103 ProjectBaseBrowser._createPopupMenus(self) 112 ProjectBaseBrowser._createPopupMenus(self)
104 self.sourceMenuActions = {} 113 self.sourceMenuActions = {}
105 114
106 if self.project.isPythonProject(): 115 if self.project.isPythonProject():
107 self.__createPythonPopupMenus() 116 self.__createPythonPopupMenus()
108 elif self.project.isRubyProject(): 117 elif self.project.isRubyProject():
109 self.__createRubyPopupMenus() 118 self.__createRubyPopupMenus()
110 elif self.project.isJavaScriptProject(): 119 elif self.project.isJavaScriptProject():
111 self.__createJavaScriptPopupMenus() 120 self.__createJavaScriptPopupMenus()
112 else: 121 else:
113 # assign generic source menu 122 # assign generic source menu
114 self.mainMenu = self.sourceMenu 123 self.mainMenu = self.sourceMenu
115 124
116 def __createPythonPopupMenus(self): 125 def __createPythonPopupMenus(self):
117 """ 126 """
118 Private method to generate the popup menus for a Python project. 127 Private method to generate the popup menus for a Python project.
119 """ 128 """
120 self.checksMenu = QMenu(self.tr('Check')) 129 self.checksMenu = QMenu(self.tr("Check"))
121 self.checksMenu.aboutToShow.connect(self.__showContextMenuCheck) 130 self.checksMenu.aboutToShow.connect(self.__showContextMenuCheck)
122 131
123 self.formattingMenu = QMenu(self.tr("Code Formatting")) 132 self.formattingMenu = QMenu(self.tr("Code Formatting"))
124 self.formattingMenu.addAction( 133 self.formattingMenu.addAction(
125 self.tr("Format Code"), 134 self.tr("Format Code"),
126 lambda: self.__performFormatWithBlack(BlackFormattingAction.Format) 135 lambda: self.__performFormatWithBlack(BlackFormattingAction.Format),
127 ) 136 )
128 self.formattingMenu.addAction( 137 self.formattingMenu.addAction(
129 self.tr("Check Formatting"), 138 self.tr("Check Formatting"),
130 lambda: self.__performFormatWithBlack(BlackFormattingAction.Check) 139 lambda: self.__performFormatWithBlack(BlackFormattingAction.Check),
131 ) 140 )
132 self.formattingMenu.addAction( 141 self.formattingMenu.addAction(
133 self.tr("Formatting Diff"), 142 self.tr("Formatting Diff"),
134 lambda: self.__performFormatWithBlack(BlackFormattingAction.Diff) 143 lambda: self.__performFormatWithBlack(BlackFormattingAction.Diff),
135 ) 144 )
136 self.formattingMenu.aboutToShow.connect(self.__showContextMenuFormatting) 145 self.formattingMenu.aboutToShow.connect(self.__showContextMenuFormatting)
137 146
138 self.menuShow = QMenu(self.tr('Show')) 147 self.menuShow = QMenu(self.tr("Show"))
139 self.menuShow.addAction( 148 self.menuShow.addAction(self.tr("Code metrics..."), self.__showCodeMetrics)
140 self.tr('Code metrics...'), self.__showCodeMetrics)
141 self.coverageMenuAction = self.menuShow.addAction( 149 self.coverageMenuAction = self.menuShow.addAction(
142 self.tr('Code coverage...'), self.__showCodeCoverage) 150 self.tr("Code coverage..."), self.__showCodeCoverage
151 )
143 self.profileMenuAction = self.menuShow.addAction( 152 self.profileMenuAction = self.menuShow.addAction(
144 self.tr('Profile data...'), self.__showProfileData) 153 self.tr("Profile data..."), self.__showProfileData
154 )
145 self.menuShow.aboutToShow.connect(self.__showContextMenuShow) 155 self.menuShow.aboutToShow.connect(self.__showContextMenuShow)
146 156
147 self.graphicsMenu = QMenu(self.tr('Diagrams')) 157 self.graphicsMenu = QMenu(self.tr("Diagrams"))
148 self.classDiagramAction = self.graphicsMenu.addAction( 158 self.classDiagramAction = self.graphicsMenu.addAction(
149 self.tr("Class Diagram..."), self.__showClassDiagram) 159 self.tr("Class Diagram..."), self.__showClassDiagram
160 )
150 self.graphicsMenu.addAction( 161 self.graphicsMenu.addAction(
151 self.tr("Package Diagram..."), self.__showPackageDiagram) 162 self.tr("Package Diagram..."), self.__showPackageDiagram
163 )
152 self.importsDiagramAction = self.graphicsMenu.addAction( 164 self.importsDiagramAction = self.graphicsMenu.addAction(
153 self.tr("Imports Diagram..."), self.__showImportsDiagram) 165 self.tr("Imports Diagram..."), self.__showImportsDiagram
166 )
154 self.graphicsMenu.addAction( 167 self.graphicsMenu.addAction(
155 self.tr("Application Diagram..."), 168 self.tr("Application Diagram..."), self.__showApplicationDiagram
156 self.__showApplicationDiagram) 169 )
157 self.graphicsMenu.addSeparator() 170 self.graphicsMenu.addSeparator()
158 self.graphicsMenu.addAction( 171 self.graphicsMenu.addAction(
159 UI.PixmapCache.getIcon("open"), 172 UI.PixmapCache.getIcon("open"),
160 self.tr("Load Diagram..."), self.__loadDiagram) 173 self.tr("Load Diagram..."),
174 self.__loadDiagram,
175 )
161 self.graphicsMenu.aboutToShow.connect(self.__showContextMenuGraphics) 176 self.graphicsMenu.aboutToShow.connect(self.__showContextMenuGraphics)
162 177
163 self.__startMenu = QMenu(self.tr("Start"), self) 178 self.__startMenu = QMenu(self.tr("Start"), self)
164 self.__startMenu.addAction( 179 self.__startMenu.addAction(
165 UI.PixmapCache.getIcon("runScript"), 180 UI.PixmapCache.getIcon("runScript"),
166 self.tr('Run Script...'), 181 self.tr("Run Script..."),
167 self.__contextMenuRunScript) 182 self.__contextMenuRunScript,
183 )
168 self.__startMenu.addAction( 184 self.__startMenu.addAction(
169 UI.PixmapCache.getIcon("debugScript"), 185 UI.PixmapCache.getIcon("debugScript"),
170 self.tr('Debug Script...'), 186 self.tr("Debug Script..."),
171 self.__contextMenuDebugScript) 187 self.__contextMenuDebugScript,
188 )
172 self.__startMenu.addAction( 189 self.__startMenu.addAction(
173 UI.PixmapCache.getIcon("profileScript"), 190 UI.PixmapCache.getIcon("profileScript"),
174 self.tr('Profile Script...'), 191 self.tr("Profile Script..."),
175 self.__contextMenuProfileScript) 192 self.__contextMenuProfileScript,
193 )
176 self.__startMenu.addAction( 194 self.__startMenu.addAction(
177 UI.PixmapCache.getIcon("coverageScript"), 195 UI.PixmapCache.getIcon("coverageScript"),
178 self.tr('Coverage run of Script...'), 196 self.tr("Coverage run of Script..."),
179 self.__contextMenuCoverageScript) 197 self.__contextMenuCoverageScript,
180 198 )
199
181 self.testingAction = self.sourceMenu.addAction( 200 self.testingAction = self.sourceMenu.addAction(
182 self.tr('Run tests...'), self.handleTesting) 201 self.tr("Run tests..."), self.handleTesting
183 self.sourceMenu.addSeparator() 202 )
184 act = self.sourceMenu.addAction( 203 self.sourceMenu.addSeparator()
185 self.tr('Rename file'), self._renameFile) 204 act = self.sourceMenu.addAction(self.tr("Rename file"), self._renameFile)
186 self.menuActions.append(act) 205 self.menuActions.append(act)
187 act = self.sourceMenu.addAction( 206 act = self.sourceMenu.addAction(
188 self.tr('Remove from project'), self._removeFile) 207 self.tr("Remove from project"), self._removeFile
208 )
189 self.menuActions.append(act) 209 self.menuActions.append(act)
190 act = self.sourceMenu.addAction( 210 act = self.sourceMenu.addAction(self.tr("Delete"), self.__deleteFile)
191 self.tr('Delete'), self.__deleteFile)
192 self.menuActions.append(act) 211 self.menuActions.append(act)
193 self.sourceMenu.addSeparator() 212 self.sourceMenu.addSeparator()
213 self.sourceMenu.addAction(self.tr("New package..."), self.__addNewPackage)
214 self.sourceMenu.addAction(self.tr("Add source files..."), self.__addSourceFiles)
194 self.sourceMenu.addAction( 215 self.sourceMenu.addAction(
195 self.tr('New package...'), self.__addNewPackage) 216 self.tr("Add source directory..."), self.__addSourceDirectory
196 self.sourceMenu.addAction( 217 )
197 self.tr('Add source files...'), self.__addSourceFiles)
198 self.sourceMenu.addAction(
199 self.tr('Add source directory...'), self.__addSourceDirectory)
200 self.sourceMenu.addSeparator() 218 self.sourceMenu.addSeparator()
201 self.sourceMenu.addMenu(self.graphicsMenu) 219 self.sourceMenu.addMenu(self.graphicsMenu)
202 self.sourceMenu.addMenu(self.checksMenu) 220 self.sourceMenu.addMenu(self.checksMenu)
203 self.sourceMenu.addMenu(self.formattingMenu) 221 self.sourceMenu.addMenu(self.formattingMenu)
204 self.sourceMenuActions["Show"] = self.sourceMenu.addMenu(self.menuShow) 222 self.sourceMenuActions["Show"] = self.sourceMenu.addMenu(self.menuShow)
205 self.sourceMenu.addSeparator() 223 self.sourceMenu.addSeparator()
206 self.__startAct = self.sourceMenu.addMenu(self.__startMenu) 224 self.__startAct = self.sourceMenu.addMenu(self.__startMenu)
207 self.sourceMenu.addSeparator() 225 self.sourceMenu.addSeparator()
208 self.sourceMenu.addAction( 226 self.sourceMenu.addAction(
209 self.tr('Copy Path to Clipboard'), self._copyToClipboard) 227 self.tr("Copy Path to Clipboard"), self._copyToClipboard
228 )
210 self.sourceMenu.addSeparator() 229 self.sourceMenu.addSeparator()
211 self.sourceMenu.addAction( 230 self.sourceMenu.addAction(
212 self.tr('Expand all directories'), self._expandAllDirs) 231 self.tr("Expand all directories"), self._expandAllDirs
232 )
213 self.sourceMenu.addAction( 233 self.sourceMenu.addAction(
214 self.tr('Collapse all directories'), self._collapseAllDirs) 234 self.tr("Collapse all directories"), self._collapseAllDirs
215 self.sourceMenu.addSeparator() 235 )
216 self.sourceMenu.addAction(self.tr('Configure...'), self._configure) 236 self.sourceMenu.addSeparator()
237 self.sourceMenu.addAction(self.tr("Configure..."), self._configure)
217 238
218 self.menu.addSeparator() 239 self.menu.addSeparator()
240 self.menu.addAction(self.tr("New package..."), self.__addNewPackage)
241 self.menu.addAction(self.tr("Add source files..."), self.__addSourceFiles)
219 self.menu.addAction( 242 self.menu.addAction(
220 self.tr('New package...'), self.__addNewPackage) 243 self.tr("Add source directory..."), self.__addSourceDirectory
221 self.menu.addAction( 244 )
222 self.tr('Add source files...'), self.__addSourceFiles)
223 self.menu.addAction(
224 self.tr('Add source directory...'), self.__addSourceDirectory)
225 self.menu.addSeparator() 245 self.menu.addSeparator()
226 self.menu.addAction( 246 self.menu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
227 self.tr('Expand all directories'), self._expandAllDirs) 247 self.menu.addAction(self.tr("Collapse all directories"), self._collapseAllDirs)
228 self.menu.addAction(
229 self.tr('Collapse all directories'), self._collapseAllDirs)
230 self.menu.addSeparator() 248 self.menu.addSeparator()
231 self.menu.addAction(self.tr('Configure...'), self._configure) 249 self.menu.addAction(self.tr("Configure..."), self._configure)
232 250
233 # create the attribute menu 251 # create the attribute menu
234 self.gotoMenu = QMenu(self.tr("Goto"), self) 252 self.gotoMenu = QMenu(self.tr("Goto"), self)
235 self.gotoMenu.aboutToShow.connect(self._showGotoMenu) 253 self.gotoMenu.aboutToShow.connect(self._showGotoMenu)
236 self.gotoMenu.triggered.connect(self._gotoAttribute) 254 self.gotoMenu.triggered.connect(self._gotoAttribute)
237 255
238 self.attributeMenu = QMenu(self) 256 self.attributeMenu = QMenu(self)
239 self.attributeMenu.addMenu(self.gotoMenu) 257 self.attributeMenu.addMenu(self.gotoMenu)
240 self.attributeMenu.addSeparator() 258 self.attributeMenu.addSeparator()
259 self.attributeMenu.addAction(self.tr("New package..."), self.__addNewPackage)
241 self.attributeMenu.addAction( 260 self.attributeMenu.addAction(
242 self.tr('New package...'), self.__addNewPackage) 261 self.tr("Add source files..."), self.project.addSourceFiles
262 )
243 self.attributeMenu.addAction( 263 self.attributeMenu.addAction(
244 self.tr('Add source files...'), self.project.addSourceFiles) 264 self.tr("Add source directory..."), self.project.addSourceDir
245 self.attributeMenu.addAction( 265 )
246 self.tr('Add source directory...'), self.project.addSourceDir)
247 self.attributeMenu.addSeparator() 266 self.attributeMenu.addSeparator()
248 self.attributeMenu.addAction( 267 self.attributeMenu.addAction(
249 self.tr('Expand all directories'), self._expandAllDirs) 268 self.tr("Expand all directories"), self._expandAllDirs
269 )
250 self.attributeMenu.addAction( 270 self.attributeMenu.addAction(
251 self.tr('Collapse all directories'), self._collapseAllDirs) 271 self.tr("Collapse all directories"), self._collapseAllDirs
272 )
252 self.attributeMenu.addSeparator() 273 self.attributeMenu.addSeparator()
253 self.attributeMenu.addAction( 274 self.attributeMenu.addAction(self.tr("Configure..."), self._configure)
254 self.tr('Configure...'), self._configure) 275
255
256 self.backMenu = QMenu(self) 276 self.backMenu = QMenu(self)
277 self.backMenu.addAction(self.tr("New package..."), self.__addNewPackage)
257 self.backMenu.addAction( 278 self.backMenu.addAction(
258 self.tr('New package...'), self.__addNewPackage) 279 self.tr("Add source files..."), self.project.addSourceFiles
280 )
259 self.backMenu.addAction( 281 self.backMenu.addAction(
260 self.tr('Add source files...'), self.project.addSourceFiles) 282 self.tr("Add source directory..."), self.project.addSourceDir
283 )
284 self.backMenu.addSeparator()
285 self.backMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
261 self.backMenu.addAction( 286 self.backMenu.addAction(
262 self.tr('Add source directory...'), self.project.addSourceDir) 287 self.tr("Collapse all directories"), self._collapseAllDirs
288 )
263 self.backMenu.addSeparator() 289 self.backMenu.addSeparator()
264 self.backMenu.addAction( 290 self.backMenu.addAction(self.tr("Configure..."), self._configure)
265 self.tr('Expand all directories'), self._expandAllDirs)
266 self.backMenu.addAction(
267 self.tr('Collapse all directories'), self._collapseAllDirs)
268 self.backMenu.addSeparator()
269 self.backMenu.addAction(self.tr('Configure...'), self._configure)
270 self.backMenu.setEnabled(False) 291 self.backMenu.setEnabled(False)
271 292
272 self.multiMenu.addSeparator() 293 self.multiMenu.addSeparator()
273 act = self.multiMenu.addAction( 294 act = self.multiMenu.addAction(self.tr("Remove from project"), self._removeFile)
274 self.tr('Remove from project'), self._removeFile)
275 self.multiMenuActions.append(act) 295 self.multiMenuActions.append(act)
276 act = self.multiMenu.addAction( 296 act = self.multiMenu.addAction(self.tr("Delete"), self.__deleteFile)
277 self.tr('Delete'), self.__deleteFile)
278 self.multiMenuActions.append(act) 297 self.multiMenuActions.append(act)
279 self.multiMenu.addSeparator() 298 self.multiMenu.addSeparator()
280 self.multiMenu.addMenu(self.checksMenu) 299 self.multiMenu.addMenu(self.checksMenu)
281 self.multiMenu.addMenu(self.formattingMenu) 300 self.multiMenu.addMenu(self.formattingMenu)
282 self.multiMenu.addSeparator() 301 self.multiMenu.addSeparator()
302 self.multiMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
283 self.multiMenu.addAction( 303 self.multiMenu.addAction(
284 self.tr('Expand all directories'), self._expandAllDirs) 304 self.tr("Collapse all directories"), self._collapseAllDirs
285 self.multiMenu.addAction( 305 )
286 self.tr('Collapse all directories'), self._collapseAllDirs)
287 self.multiMenu.addSeparator() 306 self.multiMenu.addSeparator()
288 self.multiMenu.addAction(self.tr('Configure...'), self._configure) 307 self.multiMenu.addAction(self.tr("Configure..."), self._configure)
289 308
290 self.dirMenu = QMenu(self) 309 self.dirMenu = QMenu(self)
291 act = self.dirMenu.addAction( 310 act = self.dirMenu.addAction(self.tr("Remove from project"), self._removeDir)
292 self.tr('Remove from project'), self._removeDir)
293 self.dirMenuActions.append(act) 311 self.dirMenuActions.append(act)
294 act = self.dirMenu.addAction( 312 act = self.dirMenu.addAction(self.tr("Delete"), self._deleteDirectory)
295 self.tr('Delete'), self._deleteDirectory)
296 self.dirMenuActions.append(act) 313 self.dirMenuActions.append(act)
297 self.dirMenu.addSeparator() 314 self.dirMenu.addSeparator()
315 self.dirMenu.addAction(self.tr("New package..."), self.__addNewPackage)
316 self.dirMenu.addAction(self.tr("Add source files..."), self.__addSourceFiles)
298 self.dirMenu.addAction( 317 self.dirMenu.addAction(
299 self.tr('New package...'), self.__addNewPackage) 318 self.tr("Add source directory..."), self.__addSourceDirectory
300 self.dirMenu.addAction( 319 )
301 self.tr('Add source files...'), self.__addSourceFiles)
302 self.dirMenu.addAction(
303 self.tr('Add source directory...'), self.__addSourceDirectory)
304 self.dirMenu.addSeparator() 320 self.dirMenu.addSeparator()
305 act = self.dirMenu.addMenu(self.graphicsMenu) 321 act = self.dirMenu.addMenu(self.graphicsMenu)
306 self.dirMenu.addMenu(self.checksMenu) 322 self.dirMenu.addMenu(self.checksMenu)
307 self.dirMenu.addMenu(self.formattingMenu) 323 self.dirMenu.addMenu(self.formattingMenu)
308 self.dirMenu.addSeparator() 324 self.dirMenu.addSeparator()
325 self.dirMenu.addAction(self.tr("Copy Path to Clipboard"), self._copyToClipboard)
326 self.dirMenu.addSeparator()
327 self.dirMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
309 self.dirMenu.addAction( 328 self.dirMenu.addAction(
310 self.tr('Copy Path to Clipboard'), self._copyToClipboard) 329 self.tr("Collapse all directories"), self._collapseAllDirs
311 self.dirMenu.addSeparator() 330 )
312 self.dirMenu.addAction( 331 self.dirMenu.addSeparator()
313 self.tr('Expand all directories'), self._expandAllDirs) 332 self.dirMenu.addAction(self.tr("Configure..."), self._configure)
314 self.dirMenu.addAction( 333
315 self.tr('Collapse all directories'), self._collapseAllDirs)
316 self.dirMenu.addSeparator()
317 self.dirMenu.addAction(self.tr('Configure...'), self._configure)
318
319 self.dirMultiMenu = QMenu(self) 334 self.dirMultiMenu = QMenu(self)
320 self.dirMultiMenu.addAction( 335 self.dirMultiMenu.addAction(
321 self.tr('Expand all directories'), self._expandAllDirs) 336 self.tr("Expand all directories"), self._expandAllDirs
337 )
322 self.dirMultiMenu.addAction( 338 self.dirMultiMenu.addAction(
323 self.tr('Collapse all directories'), self._collapseAllDirs) 339 self.tr("Collapse all directories"), self._collapseAllDirs
340 )
324 self.dirMultiMenu.addSeparator() 341 self.dirMultiMenu.addSeparator()
325 self.dirMultiMenu.addAction( 342 self.dirMultiMenu.addAction(self.tr("Configure..."), self._configure)
326 self.tr('Configure...'), self._configure) 343
327
328 self.sourceMenu.aboutToShow.connect(self.__showContextMenu) 344 self.sourceMenu.aboutToShow.connect(self.__showContextMenu)
329 self.multiMenu.aboutToShow.connect(self.__showContextMenuMulti) 345 self.multiMenu.aboutToShow.connect(self.__showContextMenuMulti)
330 self.dirMenu.aboutToShow.connect(self.__showContextMenuDir) 346 self.dirMenu.aboutToShow.connect(self.__showContextMenuDir)
331 self.dirMultiMenu.aboutToShow.connect(self.__showContextMenuDirMulti) 347 self.dirMultiMenu.aboutToShow.connect(self.__showContextMenuDirMulti)
332 self.backMenu.aboutToShow.connect(self.__showContextMenuBack) 348 self.backMenu.aboutToShow.connect(self.__showContextMenuBack)
333 self.mainMenu = self.sourceMenu 349 self.mainMenu = self.sourceMenu
334 350
335 def __createRubyPopupMenus(self): 351 def __createRubyPopupMenus(self):
336 """ 352 """
337 Private method to generate the popup menus for a Ruby project. 353 Private method to generate the popup menus for a Ruby project.
338 """ 354 """
339 self.graphicsMenu = QMenu(self.tr('Diagrams')) 355 self.graphicsMenu = QMenu(self.tr("Diagrams"))
340 self.classDiagramAction = self.graphicsMenu.addAction( 356 self.classDiagramAction = self.graphicsMenu.addAction(
341 self.tr("Class Diagram..."), self.__showClassDiagram) 357 self.tr("Class Diagram..."), self.__showClassDiagram
358 )
342 self.graphicsMenu.addAction( 359 self.graphicsMenu.addAction(
343 self.tr("Package Diagram..."), self.__showPackageDiagram) 360 self.tr("Package Diagram..."), self.__showPackageDiagram
361 )
344 self.graphicsMenu.addAction( 362 self.graphicsMenu.addAction(
345 self.tr("Application Diagram..."), 363 self.tr("Application Diagram..."), self.__showApplicationDiagram
346 self.__showApplicationDiagram) 364 )
347 self.graphicsMenu.addSeparator() 365 self.graphicsMenu.addSeparator()
348 self.graphicsMenu.addAction( 366 self.graphicsMenu.addAction(
349 UI.PixmapCache.getIcon("fileOpen"), 367 UI.PixmapCache.getIcon("fileOpen"),
350 self.tr("Load Diagram..."), self.__loadDiagram) 368 self.tr("Load Diagram..."),
351 369 self.__loadDiagram,
352 self.sourceMenu.addSeparator() 370 )
353 act = self.sourceMenu.addAction( 371
354 self.tr('Rename file'), self._renameFile) 372 self.sourceMenu.addSeparator()
373 act = self.sourceMenu.addAction(self.tr("Rename file"), self._renameFile)
355 self.menuActions.append(act) 374 self.menuActions.append(act)
356 act = self.sourceMenu.addAction( 375 act = self.sourceMenu.addAction(
357 self.tr('Remove from project'), self._removeFile) 376 self.tr("Remove from project"), self._removeFile
377 )
358 self.menuActions.append(act) 378 self.menuActions.append(act)
359 act = self.sourceMenu.addAction( 379 act = self.sourceMenu.addAction(self.tr("Delete"), self.__deleteFile)
360 self.tr('Delete'), self.__deleteFile)
361 self.menuActions.append(act) 380 self.menuActions.append(act)
362 self.sourceMenu.addSeparator() 381 self.sourceMenu.addSeparator()
382 self.sourceMenu.addAction(self.tr("Add source files..."), self.__addSourceFiles)
363 self.sourceMenu.addAction( 383 self.sourceMenu.addAction(
364 self.tr('Add source files...'), self.__addSourceFiles) 384 self.tr("Add source directory..."), self.__addSourceDirectory
385 )
386 self.sourceMenu.addSeparator()
387 act = self.sourceMenu.addMenu(self.graphicsMenu)
388 self.sourceMenu.addSeparator()
365 self.sourceMenu.addAction( 389 self.sourceMenu.addAction(
366 self.tr('Add source directory...'), self.__addSourceDirectory) 390 self.tr("Expand all directories"), self._expandAllDirs
367 self.sourceMenu.addSeparator() 391 )
368 act = self.sourceMenu.addMenu(self.graphicsMenu)
369 self.sourceMenu.addSeparator()
370 self.sourceMenu.addAction( 392 self.sourceMenu.addAction(
371 self.tr('Expand all directories'), self._expandAllDirs) 393 self.tr("Collapse all directories"), self._collapseAllDirs
372 self.sourceMenu.addAction( 394 )
373 self.tr('Collapse all directories'), self._collapseAllDirs) 395 self.sourceMenu.addSeparator()
374 self.sourceMenu.addSeparator() 396 self.sourceMenu.addAction(self.tr("Configure..."), self._configure)
375 self.sourceMenu.addAction(self.tr('Configure...'), self._configure)
376 397
377 self.menu.addSeparator() 398 self.menu.addSeparator()
399 self.menu.addAction(self.tr("Add source files..."), self.__addSourceFiles)
378 self.menu.addAction( 400 self.menu.addAction(
379 self.tr('Add source files...'), self.__addSourceFiles) 401 self.tr("Add source directory..."), self.__addSourceDirectory
380 self.menu.addAction( 402 )
381 self.tr('Add source directory...'), self.__addSourceDirectory)
382 self.menu.addSeparator() 403 self.menu.addSeparator()
383 self.menu.addAction( 404 self.menu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
384 self.tr('Expand all directories'), self._expandAllDirs) 405 self.menu.addAction(self.tr("Collapse all directories"), self._collapseAllDirs)
385 self.menu.addAction(
386 self.tr('Collapse all directories'), self._collapseAllDirs)
387 self.menu.addSeparator() 406 self.menu.addSeparator()
388 self.menu.addAction(self.tr('Configure...'), self._configure) 407 self.menu.addAction(self.tr("Configure..."), self._configure)
389 408
390 # create the attribute menu 409 # create the attribute menu
391 self.gotoMenu = QMenu(self.tr("Goto"), self) 410 self.gotoMenu = QMenu(self.tr("Goto"), self)
392 self.gotoMenu.aboutToShow.connect(self._showGotoMenu) 411 self.gotoMenu.aboutToShow.connect(self._showGotoMenu)
393 self.gotoMenu.triggered.connect(self._gotoAttribute) 412 self.gotoMenu.triggered.connect(self._gotoAttribute)
394 413
395 self.attributeMenu = QMenu(self) 414 self.attributeMenu = QMenu(self)
396 self.attributeMenu.addMenu(self.gotoMenu) 415 self.attributeMenu.addMenu(self.gotoMenu)
397 self.attributeMenu.addSeparator() 416 self.attributeMenu.addSeparator()
398 self.attributeMenu.addAction( 417 self.attributeMenu.addAction(
399 self.tr('Add source files...'), self.project.addSourceFiles) 418 self.tr("Add source files..."), self.project.addSourceFiles
419 )
400 self.attributeMenu.addAction( 420 self.attributeMenu.addAction(
401 self.tr('Add source directory...'), self.project.addSourceDir) 421 self.tr("Add source directory..."), self.project.addSourceDir
422 )
402 self.attributeMenu.addSeparator() 423 self.attributeMenu.addSeparator()
403 self.attributeMenu.addAction( 424 self.attributeMenu.addAction(
404 self.tr('Expand all directories'), self._expandAllDirs) 425 self.tr("Expand all directories"), self._expandAllDirs
426 )
405 self.attributeMenu.addAction( 427 self.attributeMenu.addAction(
406 self.tr('Collapse all directories'), self._collapseAllDirs) 428 self.tr("Collapse all directories"), self._collapseAllDirs
429 )
407 self.attributeMenu.addSeparator() 430 self.attributeMenu.addSeparator()
408 self.attributeMenu.addAction( 431 self.attributeMenu.addAction(self.tr("Configure..."), self._configure)
409 self.tr('Configure...'), self._configure) 432
410
411 self.backMenu = QMenu(self) 433 self.backMenu = QMenu(self)
412 self.backMenu.addAction( 434 self.backMenu.addAction(
413 self.tr('Add source files...'), self.project.addSourceFiles) 435 self.tr("Add source files..."), self.project.addSourceFiles
436 )
414 self.backMenu.addAction( 437 self.backMenu.addAction(
415 self.tr('Add source directory...'), self.project.addSourceDir) 438 self.tr("Add source directory..."), self.project.addSourceDir
439 )
416 self.backMenu.addSeparator() 440 self.backMenu.addSeparator()
441 self.backMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
417 self.backMenu.addAction( 442 self.backMenu.addAction(
418 self.tr('Expand all directories'), self._expandAllDirs) 443 self.tr("Collapse all directories"), self._collapseAllDirs
419 self.backMenu.addAction( 444 )
420 self.tr('Collapse all directories'), self._collapseAllDirs)
421 self.backMenu.setEnabled(False) 445 self.backMenu.setEnabled(False)
422 self.backMenu.addSeparator() 446 self.backMenu.addSeparator()
423 self.backMenu.addAction(self.tr('Configure...'), self._configure) 447 self.backMenu.addAction(self.tr("Configure..."), self._configure)
424 448
425 self.multiMenu.addSeparator() 449 self.multiMenu.addSeparator()
426 act = self.multiMenu.addAction( 450 act = self.multiMenu.addAction(self.tr("Remove from project"), self._removeFile)
427 self.tr('Remove from project'), self._removeFile)
428 self.multiMenuActions.append(act) 451 self.multiMenuActions.append(act)
429 act = self.multiMenu.addAction( 452 act = self.multiMenu.addAction(self.tr("Delete"), self.__deleteFile)
430 self.tr('Delete'), self.__deleteFile)
431 self.multiMenuActions.append(act) 453 self.multiMenuActions.append(act)
432 self.multiMenu.addSeparator() 454 self.multiMenu.addSeparator()
455 self.multiMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
433 self.multiMenu.addAction( 456 self.multiMenu.addAction(
434 self.tr('Expand all directories'), self._expandAllDirs) 457 self.tr("Collapse all directories"), self._collapseAllDirs
435 self.multiMenu.addAction( 458 )
436 self.tr('Collapse all directories'), self._collapseAllDirs)
437 self.multiMenu.addSeparator() 459 self.multiMenu.addSeparator()
438 self.multiMenu.addAction(self.tr('Configure...'), self._configure) 460 self.multiMenu.addAction(self.tr("Configure..."), self._configure)
439 461
440 self.dirMenu = QMenu(self) 462 self.dirMenu = QMenu(self)
441 act = self.dirMenu.addAction( 463 act = self.dirMenu.addAction(self.tr("Remove from project"), self._removeDir)
442 self.tr('Remove from project'), self._removeDir)
443 self.dirMenuActions.append(act) 464 self.dirMenuActions.append(act)
444 self.dirMenu.addSeparator() 465 self.dirMenu.addSeparator()
466 self.dirMenu.addAction(self.tr("Add source files..."), self.__addSourceFiles)
445 self.dirMenu.addAction( 467 self.dirMenu.addAction(
446 self.tr('Add source files...'), self.__addSourceFiles) 468 self.tr("Add source directory..."), self.__addSourceDirectory
469 )
470 self.dirMenu.addSeparator()
471 act = self.dirMenu.addMenu(self.graphicsMenu)
472 self.dirMenu.addSeparator()
473 self.dirMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
447 self.dirMenu.addAction( 474 self.dirMenu.addAction(
448 self.tr('Add source directory...'), self.__addSourceDirectory) 475 self.tr("Collapse all directories"), self._collapseAllDirs
449 self.dirMenu.addSeparator() 476 )
450 act = self.dirMenu.addMenu(self.graphicsMenu) 477 self.dirMenu.addSeparator()
451 self.dirMenu.addSeparator() 478 self.dirMenu.addAction(self.tr("Configure..."), self._configure)
452 self.dirMenu.addAction( 479
453 self.tr('Expand all directories'), self._expandAllDirs)
454 self.dirMenu.addAction(
455 self.tr('Collapse all directories'), self._collapseAllDirs)
456 self.dirMenu.addSeparator()
457 self.dirMenu.addAction(self.tr('Configure...'), self._configure)
458
459 self.dirMultiMenu = QMenu(self) 480 self.dirMultiMenu = QMenu(self)
460 self.dirMultiMenu.addAction( 481 self.dirMultiMenu.addAction(
461 self.tr('Expand all directories'), self._expandAllDirs) 482 self.tr("Expand all directories"), self._expandAllDirs
483 )
462 self.dirMultiMenu.addAction( 484 self.dirMultiMenu.addAction(
463 self.tr('Collapse all directories'), self._collapseAllDirs) 485 self.tr("Collapse all directories"), self._collapseAllDirs
486 )
464 self.dirMultiMenu.addSeparator() 487 self.dirMultiMenu.addSeparator()
465 self.dirMultiMenu.addAction( 488 self.dirMultiMenu.addAction(self.tr("Configure..."), self._configure)
466 self.tr('Configure...'), self._configure) 489
467
468 self.sourceMenu.aboutToShow.connect(self.__showContextMenu) 490 self.sourceMenu.aboutToShow.connect(self.__showContextMenu)
469 self.multiMenu.aboutToShow.connect(self.__showContextMenuMulti) 491 self.multiMenu.aboutToShow.connect(self.__showContextMenuMulti)
470 self.dirMenu.aboutToShow.connect(self.__showContextMenuDir) 492 self.dirMenu.aboutToShow.connect(self.__showContextMenuDir)
471 self.dirMultiMenu.aboutToShow.connect(self.__showContextMenuDirMulti) 493 self.dirMultiMenu.aboutToShow.connect(self.__showContextMenuDirMulti)
472 self.backMenu.aboutToShow.connect(self.__showContextMenuBack) 494 self.backMenu.aboutToShow.connect(self.__showContextMenuBack)
473 self.mainMenu = self.sourceMenu 495 self.mainMenu = self.sourceMenu
474 496
475 def __createJavaScriptPopupMenus(self): 497 def __createJavaScriptPopupMenus(self):
476 """ 498 """
477 Private method to generate the popup menus for a Python project. 499 Private method to generate the popup menus for a Python project.
478 """ 500 """
479 self.checksMenu = QMenu(self.tr('Check')) 501 self.checksMenu = QMenu(self.tr("Check"))
480 self.checksMenu.aboutToShow.connect(self.__showContextMenuCheck) 502 self.checksMenu.aboutToShow.connect(self.__showContextMenuCheck)
481 503
482 self.sourceMenu.addSeparator() 504 self.sourceMenu.addSeparator()
483 act = self.sourceMenu.addAction( 505 act = self.sourceMenu.addAction(self.tr("Rename file"), self._renameFile)
484 self.tr('Rename file'), self._renameFile)
485 self.menuActions.append(act) 506 self.menuActions.append(act)
486 act = self.sourceMenu.addAction( 507 act = self.sourceMenu.addAction(
487 self.tr('Remove from project'), self._removeFile) 508 self.tr("Remove from project"), self._removeFile
509 )
488 self.menuActions.append(act) 510 self.menuActions.append(act)
489 act = self.sourceMenu.addAction( 511 act = self.sourceMenu.addAction(self.tr("Delete"), self.__deleteFile)
490 self.tr('Delete'), self.__deleteFile)
491 self.menuActions.append(act) 512 self.menuActions.append(act)
492 self.sourceMenu.addSeparator() 513 self.sourceMenu.addSeparator()
514 self.sourceMenu.addAction(self.tr("Add source files..."), self.__addSourceFiles)
493 self.sourceMenu.addAction( 515 self.sourceMenu.addAction(
494 self.tr('Add source files...'), self.__addSourceFiles) 516 self.tr("Add source directory..."), self.__addSourceDirectory
517 )
518 self.sourceMenu.addSeparator()
519 self.sourceMenu.addMenu(self.checksMenu)
520 self.sourceMenu.addSeparator()
495 self.sourceMenu.addAction( 521 self.sourceMenu.addAction(
496 self.tr('Add source directory...'), self.__addSourceDirectory) 522 self.tr("Copy Path to Clipboard"), self._copyToClipboard
497 self.sourceMenu.addSeparator() 523 )
498 self.sourceMenu.addMenu(self.checksMenu)
499 self.sourceMenu.addSeparator() 524 self.sourceMenu.addSeparator()
500 self.sourceMenu.addAction( 525 self.sourceMenu.addAction(
501 self.tr('Copy Path to Clipboard'), self._copyToClipboard) 526 self.tr("Expand all directories"), self._expandAllDirs
502 self.sourceMenu.addSeparator() 527 )
503 self.sourceMenu.addAction( 528 self.sourceMenu.addAction(
504 self.tr('Expand all directories'), self._expandAllDirs) 529 self.tr("Collapse all directories"), self._collapseAllDirs
505 self.sourceMenu.addAction( 530 )
506 self.tr('Collapse all directories'), self._collapseAllDirs) 531 self.sourceMenu.addSeparator()
507 self.sourceMenu.addSeparator() 532 self.sourceMenu.addAction(self.tr("Configure..."), self._configure)
508 self.sourceMenu.addAction(self.tr('Configure...'), self._configure)
509 533
510 self.menu.addSeparator() 534 self.menu.addSeparator()
535 self.menu.addAction(self.tr("Add source files..."), self.__addSourceFiles)
511 self.menu.addAction( 536 self.menu.addAction(
512 self.tr('Add source files...'), self.__addSourceFiles) 537 self.tr("Add source directory..."), self.__addSourceDirectory
513 self.menu.addAction( 538 )
514 self.tr('Add source directory...'), self.__addSourceDirectory)
515 self.menu.addSeparator() 539 self.menu.addSeparator()
516 self.menu.addAction( 540 self.menu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
517 self.tr('Expand all directories'), self._expandAllDirs) 541 self.menu.addAction(self.tr("Collapse all directories"), self._collapseAllDirs)
518 self.menu.addAction(
519 self.tr('Collapse all directories'), self._collapseAllDirs)
520 self.menu.addSeparator() 542 self.menu.addSeparator()
521 self.menu.addAction(self.tr('Configure...'), self._configure) 543 self.menu.addAction(self.tr("Configure..."), self._configure)
522 544
523 # create the attribute menu 545 # create the attribute menu
524 self.gotoMenu = QMenu(self.tr("Goto"), self) 546 self.gotoMenu = QMenu(self.tr("Goto"), self)
525 self.gotoMenu.aboutToShow.connect(self._showGotoMenu) 547 self.gotoMenu.aboutToShow.connect(self._showGotoMenu)
526 self.gotoMenu.triggered.connect(self._gotoAttribute) 548 self.gotoMenu.triggered.connect(self._gotoAttribute)
527 549
528 self.attributeMenu = QMenu(self) 550 self.attributeMenu = QMenu(self)
529 self.attributeMenu.addMenu(self.gotoMenu) 551 self.attributeMenu.addMenu(self.gotoMenu)
530 self.attributeMenu.addSeparator() 552 self.attributeMenu.addSeparator()
531 self.attributeMenu.addAction( 553 self.attributeMenu.addAction(
532 self.tr('Add source files...'), self.project.addSourceFiles) 554 self.tr("Add source files..."), self.project.addSourceFiles
555 )
533 self.attributeMenu.addAction( 556 self.attributeMenu.addAction(
534 self.tr('Add source directory...'), self.project.addSourceDir) 557 self.tr("Add source directory..."), self.project.addSourceDir
558 )
535 self.attributeMenu.addSeparator() 559 self.attributeMenu.addSeparator()
536 self.attributeMenu.addAction( 560 self.attributeMenu.addAction(
537 self.tr('Expand all directories'), self._expandAllDirs) 561 self.tr("Expand all directories"), self._expandAllDirs
562 )
538 self.attributeMenu.addAction( 563 self.attributeMenu.addAction(
539 self.tr('Collapse all directories'), self._collapseAllDirs) 564 self.tr("Collapse all directories"), self._collapseAllDirs
565 )
540 self.attributeMenu.addSeparator() 566 self.attributeMenu.addSeparator()
541 self.attributeMenu.addAction( 567 self.attributeMenu.addAction(self.tr("Configure..."), self._configure)
542 self.tr('Configure...'), self._configure) 568
543
544 self.backMenu = QMenu(self) 569 self.backMenu = QMenu(self)
545 self.backMenu.addAction( 570 self.backMenu.addAction(
546 self.tr('Add source files...'), self.project.addSourceFiles) 571 self.tr("Add source files..."), self.project.addSourceFiles
572 )
547 self.backMenu.addAction( 573 self.backMenu.addAction(
548 self.tr('Add source directory...'), self.project.addSourceDir) 574 self.tr("Add source directory..."), self.project.addSourceDir
575 )
549 self.backMenu.addSeparator() 576 self.backMenu.addSeparator()
577 self.backMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
550 self.backMenu.addAction( 578 self.backMenu.addAction(
551 self.tr('Expand all directories'), self._expandAllDirs) 579 self.tr("Collapse all directories"), self._collapseAllDirs
552 self.backMenu.addAction( 580 )
553 self.tr('Collapse all directories'), self._collapseAllDirs)
554 self.backMenu.addSeparator() 581 self.backMenu.addSeparator()
555 self.backMenu.addAction(self.tr('Configure...'), self._configure) 582 self.backMenu.addAction(self.tr("Configure..."), self._configure)
556 self.backMenu.setEnabled(False) 583 self.backMenu.setEnabled(False)
557 584
558 self.multiMenu.addSeparator() 585 self.multiMenu.addSeparator()
559 act = self.multiMenu.addAction( 586 act = self.multiMenu.addAction(self.tr("Remove from project"), self._removeFile)
560 self.tr('Remove from project'), self._removeFile)
561 self.multiMenuActions.append(act) 587 self.multiMenuActions.append(act)
562 act = self.multiMenu.addAction( 588 act = self.multiMenu.addAction(self.tr("Delete"), self.__deleteFile)
563 self.tr('Delete'), self.__deleteFile)
564 self.multiMenuActions.append(act) 589 self.multiMenuActions.append(act)
565 self.multiMenu.addSeparator() 590 self.multiMenu.addSeparator()
566 self.multiMenu.addMenu(self.checksMenu) 591 self.multiMenu.addMenu(self.checksMenu)
567 self.multiMenu.addSeparator() 592 self.multiMenu.addSeparator()
593 self.multiMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
568 self.multiMenu.addAction( 594 self.multiMenu.addAction(
569 self.tr('Expand all directories'), self._expandAllDirs) 595 self.tr("Collapse all directories"), self._collapseAllDirs
570 self.multiMenu.addAction( 596 )
571 self.tr('Collapse all directories'), self._collapseAllDirs)
572 self.multiMenu.addSeparator() 597 self.multiMenu.addSeparator()
573 self.multiMenu.addAction(self.tr('Configure...'), self._configure) 598 self.multiMenu.addAction(self.tr("Configure..."), self._configure)
574 599
575 self.dirMenu = QMenu(self) 600 self.dirMenu = QMenu(self)
576 act = self.dirMenu.addAction( 601 act = self.dirMenu.addAction(self.tr("Remove from project"), self._removeDir)
577 self.tr('Remove from project'), self._removeDir)
578 self.dirMenuActions.append(act) 602 self.dirMenuActions.append(act)
579 act = self.dirMenu.addAction( 603 act = self.dirMenu.addAction(self.tr("Delete"), self._deleteDirectory)
580 self.tr('Delete'), self._deleteDirectory)
581 self.dirMenuActions.append(act) 604 self.dirMenuActions.append(act)
582 self.dirMenu.addSeparator() 605 self.dirMenu.addSeparator()
606 self.dirMenu.addAction(self.tr("Add source files..."), self.__addSourceFiles)
583 self.dirMenu.addAction( 607 self.dirMenu.addAction(
584 self.tr('Add source files...'), self.__addSourceFiles) 608 self.tr("Add source directory..."), self.__addSourceDirectory
609 )
610 self.dirMenu.addSeparator()
611 self.dirMenu.addMenu(self.checksMenu)
612 self.dirMenu.addSeparator()
613 self.dirMenu.addAction(self.tr("Copy Path to Clipboard"), self._copyToClipboard)
614 self.dirMenu.addSeparator()
615 self.dirMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
585 self.dirMenu.addAction( 616 self.dirMenu.addAction(
586 self.tr('Add source directory...'), self.__addSourceDirectory) 617 self.tr("Collapse all directories"), self._collapseAllDirs
587 self.dirMenu.addSeparator() 618 )
588 self.dirMenu.addMenu(self.checksMenu) 619 self.dirMenu.addSeparator()
589 self.dirMenu.addSeparator() 620 self.dirMenu.addAction(self.tr("Configure..."), self._configure)
590 self.dirMenu.addAction( 621
591 self.tr('Copy Path to Clipboard'), self._copyToClipboard)
592 self.dirMenu.addSeparator()
593 self.dirMenu.addAction(
594 self.tr('Expand all directories'), self._expandAllDirs)
595 self.dirMenu.addAction(
596 self.tr('Collapse all directories'), self._collapseAllDirs)
597 self.dirMenu.addSeparator()
598 self.dirMenu.addAction(self.tr('Configure...'), self._configure)
599
600 self.dirMultiMenu = QMenu(self) 622 self.dirMultiMenu = QMenu(self)
601 self.dirMultiMenu.addAction( 623 self.dirMultiMenu.addAction(
602 self.tr('Expand all directories'), self._expandAllDirs) 624 self.tr("Expand all directories"), self._expandAllDirs
625 )
603 self.dirMultiMenu.addAction( 626 self.dirMultiMenu.addAction(
604 self.tr('Collapse all directories'), self._collapseAllDirs) 627 self.tr("Collapse all directories"), self._collapseAllDirs
628 )
605 self.dirMultiMenu.addSeparator() 629 self.dirMultiMenu.addSeparator()
606 self.dirMultiMenu.addAction( 630 self.dirMultiMenu.addAction(self.tr("Configure..."), self._configure)
607 self.tr('Configure...'), self._configure) 631
608
609 self.sourceMenu.aboutToShow.connect(self.__showContextMenu) 632 self.sourceMenu.aboutToShow.connect(self.__showContextMenu)
610 self.multiMenu.aboutToShow.connect(self.__showContextMenuMulti) 633 self.multiMenu.aboutToShow.connect(self.__showContextMenuMulti)
611 self.dirMenu.aboutToShow.connect(self.__showContextMenuDir) 634 self.dirMenu.aboutToShow.connect(self.__showContextMenuDir)
612 self.dirMultiMenu.aboutToShow.connect(self.__showContextMenuDirMulti) 635 self.dirMultiMenu.aboutToShow.connect(self.__showContextMenuDirMulti)
613 self.backMenu.aboutToShow.connect(self.__showContextMenuBack) 636 self.backMenu.aboutToShow.connect(self.__showContextMenuBack)
614 self.mainMenu = self.sourceMenu 637 self.mainMenu = self.sourceMenu
615 638
616 def _contextMenuRequested(self, coord): 639 def _contextMenuRequested(self, coord):
617 """ 640 """
618 Protected slot to show the context menu. 641 Protected slot to show the context menu.
619 642
620 @param coord the position of the mouse pointer (QPoint) 643 @param coord the position of the mouse pointer (QPoint)
621 """ 644 """
622 if not self.project.isOpen(): 645 if not self.project.isOpen():
623 return 646 return
624 647
625 with contextlib.suppress(Exception): 648 with contextlib.suppress(Exception):
626 categories = self.getSelectedItemsCountCategorized( 649 categories = self.getSelectedItemsCountCategorized(
627 [ProjectBrowserFileItem, BrowserClassItem, 650 [
628 BrowserMethodItem, ProjectBrowserSimpleDirectoryItem, 651 ProjectBrowserFileItem,
629 BrowserClassAttributeItem, BrowserImportItem]) 652 BrowserClassItem,
653 BrowserMethodItem,
654 ProjectBrowserSimpleDirectoryItem,
655 BrowserClassAttributeItem,
656 BrowserImportItem,
657 ]
658 )
630 cnt = categories["sum"] 659 cnt = categories["sum"]
631 if cnt <= 1: 660 if cnt <= 1:
632 index = self.indexAt(coord) 661 index = self.indexAt(coord)
633 if index.isValid(): 662 if index.isValid():
634 self._selectSingleItem(index) 663 self._selectSingleItem(index)
635 categories = self.getSelectedItemsCountCategorized( 664 categories = self.getSelectedItemsCountCategorized(
636 [ProjectBrowserFileItem, BrowserClassItem, 665 [
637 BrowserMethodItem, ProjectBrowserSimpleDirectoryItem, 666 ProjectBrowserFileItem,
638 BrowserClassAttributeItem, BrowserImportItem]) 667 BrowserClassItem,
668 BrowserMethodItem,
669 ProjectBrowserSimpleDirectoryItem,
670 BrowserClassAttributeItem,
671 BrowserImportItem,
672 ]
673 )
639 cnt = categories["sum"] 674 cnt = categories["sum"]
640 675
641 bfcnt = categories[str(ProjectBrowserFileItem)] 676 bfcnt = categories[str(ProjectBrowserFileItem)]
642 cmcnt = ( 677 cmcnt = (
643 categories[str(BrowserClassItem)] + 678 categories[str(BrowserClassItem)]
644 categories[str(BrowserMethodItem)] + 679 + categories[str(BrowserMethodItem)]
645 categories[str(BrowserClassAttributeItem)] + 680 + categories[str(BrowserClassAttributeItem)]
646 categories[str(BrowserImportItem)] 681 + categories[str(BrowserImportItem)]
647 ) 682 )
648 sdcnt = categories[str(ProjectBrowserSimpleDirectoryItem)] 683 sdcnt = categories[str(ProjectBrowserSimpleDirectoryItem)]
649 if cnt > 1 and cnt == bfcnt: 684 if cnt > 1 and cnt == bfcnt:
650 self.multiMenu.popup(self.mapToGlobal(coord)) 685 self.multiMenu.popup(self.mapToGlobal(coord))
651 elif cnt > 1 and cnt == sdcnt: 686 elif cnt > 1 and cnt == sdcnt:
656 if bfcnt == 1 or cmcnt == 1: 691 if bfcnt == 1 or cmcnt == 1:
657 itm = self.model().item(index) 692 itm = self.model().item(index)
658 if isinstance(itm, ProjectBrowserFileItem): 693 if isinstance(itm, ProjectBrowserFileItem):
659 fn = itm.fileName() 694 fn = itm.fileName()
660 if self.project.isPythonProject(): 695 if self.project.isPythonProject():
661 if fn.endswith('.ptl'): 696 if fn.endswith(".ptl"):
662 for act in self.sourceMenuActions.values(): 697 for act in self.sourceMenuActions.values():
663 act.setEnabled(False) 698 act.setEnabled(False)
664 self.classDiagramAction.setEnabled(True) 699 self.classDiagramAction.setEnabled(True)
665 self.importsDiagramAction.setEnabled(True) 700 self.importsDiagramAction.setEnabled(True)
666 self.testingAction.setEnabled(False) 701 self.testingAction.setEnabled(False)
667 self.checksMenu.menuAction().setEnabled( 702 self.checksMenu.menuAction().setEnabled(False)
668 False) 703 elif fn.endswith(".rb"):
669 elif fn.endswith('.rb'):
670 # entry for mixed mode programs 704 # entry for mixed mode programs
671 for act in self.sourceMenuActions.values(): 705 for act in self.sourceMenuActions.values():
672 act.setEnabled(False) 706 act.setEnabled(False)
673 self.classDiagramAction.setEnabled(True) 707 self.classDiagramAction.setEnabled(True)
674 self.importsDiagramAction.setEnabled(False) 708 self.importsDiagramAction.setEnabled(False)
675 self.testingAction.setEnabled(False) 709 self.testingAction.setEnabled(False)
676 self.checksMenu.menuAction().setEnabled( 710 self.checksMenu.menuAction().setEnabled(False)
677 False) 711 elif fn.endswith(".js"):
678 elif fn.endswith('.js'):
679 # entry for mixed mode programs 712 # entry for mixed mode programs
680 for act in self.sourceMenuActions.values(): 713 for act in self.sourceMenuActions.values():
681 act.setEnabled(False) 714 act.setEnabled(False)
682 self.testingAction.setEnabled(False) 715 self.testingAction.setEnabled(False)
683 self.checksMenu.menuAction().setEnabled( 716 self.checksMenu.menuAction().setEnabled(False)
684 False) 717 self.graphicsMenu.menuAction().setEnabled(False)
685 self.graphicsMenu.menuAction().setEnabled(
686 False)
687 else: 718 else:
688 # assume the source file is a Python file 719 # assume the source file is a Python file
689 for act in self.sourceMenuActions.values(): 720 for act in self.sourceMenuActions.values():
690 act.setEnabled(True) 721 act.setEnabled(True)
691 self.classDiagramAction.setEnabled(True) 722 self.classDiagramAction.setEnabled(True)
692 self.importsDiagramAction.setEnabled(True) 723 self.importsDiagramAction.setEnabled(True)
693 self.testingAction.setEnabled(True) 724 self.testingAction.setEnabled(True)
694 self.checksMenu.menuAction().setEnabled( 725 self.checksMenu.menuAction().setEnabled(True)
695 True)
696 self.sourceMenu.popup(self.mapToGlobal(coord)) 726 self.sourceMenu.popup(self.mapToGlobal(coord))
697 elif isinstance( 727 elif isinstance(
698 itm, 728 itm,
699 (BrowserClassItem, BrowserMethodItem, 729 (BrowserClassItem, BrowserMethodItem, BrowserImportItem),
700 BrowserImportItem)
701 ): 730 ):
702 self.menu.popup(self.mapToGlobal(coord)) 731 self.menu.popup(self.mapToGlobal(coord))
703 elif isinstance(itm, BrowserClassAttributeItem): 732 elif isinstance(itm, BrowserClassAttributeItem):
704 self.attributeMenu.popup(self.mapToGlobal(coord)) 733 self.attributeMenu.popup(self.mapToGlobal(coord))
705 else: 734 else:
709 self.dirMenu.popup(self.mapToGlobal(coord)) 738 self.dirMenu.popup(self.mapToGlobal(coord))
710 else: 739 else:
711 self.backMenu.popup(self.mapToGlobal(coord)) 740 self.backMenu.popup(self.mapToGlobal(coord))
712 else: 741 else:
713 self.backMenu.popup(self.mapToGlobal(coord)) 742 self.backMenu.popup(self.mapToGlobal(coord))
714 743
715 def __showContextMenu(self): 744 def __showContextMenu(self):
716 """ 745 """
717 Private slot called by the sourceMenu aboutToShow signal. 746 Private slot called by the sourceMenu aboutToShow signal.
718 """ 747 """
719 ProjectBaseBrowser._showContextMenu(self, self.sourceMenu) 748 ProjectBaseBrowser._showContextMenu(self, self.sourceMenu)
720 749
721 itm = self.model().item(self.currentIndex()) 750 itm = self.model().item(self.currentIndex())
722 if itm: 751 if itm:
723 try: 752 try:
724 self.__startAct.setEnabled(itm.isPython3File()) 753 self.__startAct.setEnabled(itm.isPython3File())
725 except AttributeError: 754 except AttributeError:
726 self.__startAct.setEnabled(False) 755 self.__startAct.setEnabled(False)
727 else: 756 else:
728 self.__startAct.setEnabled(False) 757 self.__startAct.setEnabled(False)
729 758
730 self.showMenu.emit("Main", self.sourceMenu) 759 self.showMenu.emit("Main", self.sourceMenu)
731 760
732 def __showContextMenuMulti(self): 761 def __showContextMenuMulti(self):
733 """ 762 """
734 Private slot called by the multiMenu aboutToShow signal. 763 Private slot called by the multiMenu aboutToShow signal.
735 """ 764 """
736 ProjectBaseBrowser._showContextMenuMulti(self, self.multiMenu) 765 ProjectBaseBrowser._showContextMenuMulti(self, self.multiMenu)
737 766
738 self.showMenu.emit("MainMulti", self.multiMenu) 767 self.showMenu.emit("MainMulti", self.multiMenu)
739 768
740 def __showContextMenuDir(self): 769 def __showContextMenuDir(self):
741 """ 770 """
742 Private slot called by the dirMenu aboutToShow signal. 771 Private slot called by the dirMenu aboutToShow signal.
743 """ 772 """
744 ProjectBaseBrowser._showContextMenuDir(self, self.dirMenu) 773 ProjectBaseBrowser._showContextMenuDir(self, self.dirMenu)
745 774
746 self.showMenu.emit("MainDir", self.dirMenu) 775 self.showMenu.emit("MainDir", self.dirMenu)
747 776
748 def __showContextMenuDirMulti(self): 777 def __showContextMenuDirMulti(self):
749 """ 778 """
750 Private slot called by the dirMultiMenu aboutToShow signal. 779 Private slot called by the dirMultiMenu aboutToShow signal.
751 """ 780 """
752 ProjectBaseBrowser._showContextMenuDirMulti(self, self.dirMultiMenu) 781 ProjectBaseBrowser._showContextMenuDirMulti(self, self.dirMultiMenu)
753 782
754 self.showMenu.emit("MainDirMulti", self.dirMultiMenu) 783 self.showMenu.emit("MainDirMulti", self.dirMultiMenu)
755 784
756 def __showContextMenuBack(self): 785 def __showContextMenuBack(self):
757 """ 786 """
758 Private slot called by the backMenu aboutToShow signal. 787 Private slot called by the backMenu aboutToShow signal.
759 """ 788 """
760 ProjectBaseBrowser._showContextMenuBack(self, self.backMenu) 789 ProjectBaseBrowser._showContextMenuBack(self, self.backMenu)
761 790
762 self.showMenu.emit("MainBack", self.backMenu) 791 self.showMenu.emit("MainBack", self.backMenu)
763 792
764 def __showContextMenuShow(self): 793 def __showContextMenuShow(self):
765 """ 794 """
766 Private slot called before the show menu is shown. 795 Private slot called before the show menu is shown.
767 """ 796 """
768 prEnable = False 797 prEnable = False
769 coEnable = False 798 coEnable = False
770 799
771 # first check if the file belongs to a project and there is 800 # first check if the file belongs to a project and there is
772 # a project coverage file 801 # a project coverage file
773 fn = self.project.getMainScript(True) 802 fn = self.project.getMainScript(True)
774 if fn is not None: 803 if fn is not None:
775 prEnable = ( 804 prEnable = self.project.isPy3Project() and bool(
776 self.project.isPy3Project() and 805 Utilities.getProfileFileNames(fn)
777 bool(Utilities.getProfileFileNames(fn))
778 ) 806 )
779 coEnable = ( 807 coEnable = self.project.isPy3Project() and bool(
780 self.project.isPy3Project() and 808 Utilities.getCoverageFileNames(fn)
781 bool(Utilities.getCoverageFileNames(fn))
782 ) 809 )
783 810
784 # now check the selected item 811 # now check the selected item
785 itm = self.model().item(self.currentIndex()) 812 itm = self.model().item(self.currentIndex())
786 fn = itm.fileName() 813 fn = itm.fileName()
787 if fn is not None: 814 if fn is not None:
788 prEnable |= ( 815 prEnable |= itm.isPython3File() and bool(Utilities.getProfileFileNames(fn))
789 itm.isPython3File() and 816 coEnable |= itm.isPython3File() and bool(Utilities.getCoverageFileName(fn))
790 bool(Utilities.getProfileFileNames(fn)) 817
791 )
792 coEnable |= (
793 itm.isPython3File() and
794 bool(Utilities.getCoverageFileName(fn))
795 )
796
797 self.profileMenuAction.setEnabled(prEnable) 818 self.profileMenuAction.setEnabled(prEnable)
798 self.coverageMenuAction.setEnabled(coEnable) 819 self.coverageMenuAction.setEnabled(coEnable)
799 820
800 self.showMenu.emit("Show", self.menuShow) 821 self.showMenu.emit("Show", self.menuShow)
801 822
802 def _openItem(self): 823 def _openItem(self):
803 """ 824 """
804 Protected slot to handle the open popup menu entry. 825 Protected slot to handle the open popup menu entry.
805 """ 826 """
806 itmList = self.getSelectedItems( 827 itmList = self.getSelectedItems(
807 [BrowserFileItem, BrowserClassItem, BrowserMethodItem, 828 [
808 BrowserClassAttributeItem, BrowserImportItem]) 829 BrowserFileItem,
809 830 BrowserClassItem,
831 BrowserMethodItem,
832 BrowserClassAttributeItem,
833 BrowserImportItem,
834 ]
835 )
836
810 for itm in itmList: 837 for itm in itmList:
811 if isinstance(itm, BrowserFileItem): 838 if isinstance(itm, BrowserFileItem):
812 if itm.isPython3File(): 839 if itm.isPython3File():
813 self.sourceFile[str].emit(itm.fileName()) 840 self.sourceFile[str].emit(itm.fileName())
814 elif itm.isRubyFile(): 841 elif itm.isRubyFile():
815 self.sourceFile[str, int, str].emit( 842 self.sourceFile[str, int, str].emit(itm.fileName(), -1, "Ruby")
816 itm.fileName(), -1, "Ruby")
817 elif itm.isDFile(): 843 elif itm.isDFile():
818 self.sourceFile[str, int, str].emit( 844 self.sourceFile[str, int, str].emit(itm.fileName(), -1, "D")
819 itm.fileName(), -1, "D")
820 else: 845 else:
821 self.sourceFile[str].emit(itm.fileName()) 846 self.sourceFile[str].emit(itm.fileName())
822 elif isinstance(itm, BrowserClassItem): 847 elif isinstance(itm, BrowserClassItem):
823 self.sourceFile[str, int].emit( 848 self.sourceFile[str, int].emit(itm.fileName(), itm.classObject().lineno)
824 itm.fileName(), itm.classObject().lineno)
825 elif isinstance(itm, BrowserMethodItem): 849 elif isinstance(itm, BrowserMethodItem):
826 self.sourceFile[str, int].emit( 850 self.sourceFile[str, int].emit(
827 itm.fileName(), itm.functionObject().lineno) 851 itm.fileName(), itm.functionObject().lineno
852 )
828 elif isinstance(itm, BrowserClassAttributeItem): 853 elif isinstance(itm, BrowserClassAttributeItem):
829 self.sourceFile[str, int].emit( 854 self.sourceFile[str, int].emit(
830 itm.fileName(), itm.attributeObject().lineno) 855 itm.fileName(), itm.attributeObject().lineno
856 )
831 elif isinstance(itm, BrowserImportItem): 857 elif isinstance(itm, BrowserImportItem):
832 self.sourceFile[str, list].emit( 858 self.sourceFile[str, list].emit(itm.fileName(), itm.linenos())
833 itm.fileName(), itm.linenos()) 859
834
835 def __addNewPackage(self): 860 def __addNewPackage(self):
836 """ 861 """
837 Private method to add a new package to the project. 862 Private method to add a new package to the project.
838 """ 863 """
839 itm = self.model().item(self.currentIndex()) 864 itm = self.model().item(self.currentIndex())
840 if isinstance( 865 if isinstance(
841 itm, 866 itm, (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem)
842 (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem)
843 ): 867 ):
844 dn = os.path.dirname(itm.fileName()) 868 dn = os.path.dirname(itm.fileName())
845 elif isinstance( 869 elif isinstance(
846 itm, 870 itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
847 (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
848 ): 871 ):
849 dn = itm.dirName() 872 dn = itm.dirName()
850 else: 873 else:
851 dn = "" 874 dn = ""
852 875
853 dn = self.project.getRelativePath(dn) 876 dn = self.project.getRelativePath(dn)
854 if dn.startswith(os.sep): 877 if dn.startswith(os.sep):
855 dn = dn[1:] 878 dn = dn[1:]
856 from .NewPythonPackageDialog import NewPythonPackageDialog 879 from .NewPythonPackageDialog import NewPythonPackageDialog
880
857 dlg = NewPythonPackageDialog(dn, self) 881 dlg = NewPythonPackageDialog(dn, self)
858 if dlg.exec() == QDialog.DialogCode.Accepted: 882 if dlg.exec() == QDialog.DialogCode.Accepted:
859 packageName = dlg.getData() 883 packageName = dlg.getData()
860 nameParts = packageName.split(".") 884 nameParts = packageName.split(".")
861 packagePath = self.project.ppath 885 packagePath = self.project.ppath
870 self, 894 self,
871 self.tr("Add new Python package"), 895 self.tr("Add new Python package"),
872 self.tr( 896 self.tr(
873 """<p>The package directory <b>{0}</b> could""" 897 """<p>The package directory <b>{0}</b> could"""
874 """ not be created. Aborting...</p>""" 898 """ not be created. Aborting...</p>"""
875 """<p>Reason: {1}</p>""") 899 """<p>Reason: {1}</p>"""
876 .format(packagePath, str(err))) 900 ).format(packagePath, str(err)),
901 )
877 return 902 return
878 packageFile = os.path.join(packagePath, "__init__.py") 903 packageFile = os.path.join(packagePath, "__init__.py")
879 if not os.path.exists(packageFile): 904 if not os.path.exists(packageFile):
880 try: 905 try:
881 with open(packageFile, "w", encoding="utf-8"): 906 with open(packageFile, "w", encoding="utf-8"):
885 self, 910 self,
886 self.tr("Add new Python package"), 911 self.tr("Add new Python package"),
887 self.tr( 912 self.tr(
888 """<p>The package file <b>{0}</b> could""" 913 """<p>The package file <b>{0}</b> could"""
889 """ not be created. Aborting...</p>""" 914 """ not be created. Aborting...</p>"""
890 """<p>Reason: {1}</p>""") 915 """<p>Reason: {1}</p>"""
891 .format(packageFile, str(err))) 916 ).format(packageFile, str(err)),
917 )
892 return 918 return
893 self.project.appendFile(packageFile) 919 self.project.appendFile(packageFile)
894 if packageFile: 920 if packageFile:
895 self.sourceFile[str].emit(packageFile) 921 self.sourceFile[str].emit(packageFile)
896 922
897 def __addSourceFiles(self): 923 def __addSourceFiles(self):
898 """ 924 """
899 Private method to add a source file to the project. 925 Private method to add a source file to the project.
900 """ 926 """
901 itm = self.model().item(self.currentIndex()) 927 itm = self.model().item(self.currentIndex())
902 if isinstance( 928 if isinstance(
903 itm, 929 itm, (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem)
904 (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem)
905 ): 930 ):
906 dn = os.path.dirname(itm.fileName()) 931 dn = os.path.dirname(itm.fileName())
907 elif isinstance( 932 elif isinstance(
908 itm, 933 itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
909 (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
910 ): 934 ):
911 dn = itm.dirName() 935 dn = itm.dirName()
912 else: 936 else:
913 dn = None 937 dn = None
914 self.project.addFiles('source', dn) 938 self.project.addFiles("source", dn)
915 939
916 def __addSourceDirectory(self): 940 def __addSourceDirectory(self):
917 """ 941 """
918 Private method to add source files of a directory to the project. 942 Private method to add source files of a directory to the project.
919 """ 943 """
920 itm = self.model().item(self.currentIndex()) 944 itm = self.model().item(self.currentIndex())
921 if isinstance( 945 if isinstance(
922 itm, 946 itm, (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem)
923 (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem)
924 ): 947 ):
925 dn = os.path.dirname(itm.fileName()) 948 dn = os.path.dirname(itm.fileName())
926 elif isinstance( 949 elif isinstance(
927 itm, 950 itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
928 (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
929 ): 951 ):
930 dn = itm.dirName() 952 dn = itm.dirName()
931 else: 953 else:
932 dn = None 954 dn = None
933 self.project.addDirectory('source', dn) 955 self.project.addDirectory("source", dn)
934 956
935 def __deleteFile(self): 957 def __deleteFile(self):
936 """ 958 """
937 Private method to delete files from the project. 959 Private method to delete files from the project.
938 """ 960 """
939 itmList = self.getSelectedItems() 961 itmList = self.getSelectedItems()
940 962
941 files = [] 963 files = []
942 fullNames = [] 964 fullNames = []
943 for itm in itmList: 965 for itm in itmList:
944 fn2 = itm.fileName() 966 fn2 = itm.fileName()
945 fullNames.append(fn2) 967 fullNames.append(fn2)
946 fn = self.project.getRelativePath(fn2) 968 fn = self.project.getRelativePath(fn2)
947 files.append(fn) 969 files.append(fn)
948 970
949 from UI.DeleteFilesConfirmationDialog import ( 971 from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
950 DeleteFilesConfirmationDialog 972
951 )
952 dlg = DeleteFilesConfirmationDialog( 973 dlg = DeleteFilesConfirmationDialog(
953 self.parent(), 974 self.parent(),
954 self.tr("Delete files"), 975 self.tr("Delete files"),
955 self.tr( 976 self.tr("Do you really want to delete these files from the project?"),
956 "Do you really want to delete these files from the project?"), 977 files,
957 files) 978 )
958 979
959 if dlg.exec() == QDialog.DialogCode.Accepted: 980 if dlg.exec() == QDialog.DialogCode.Accepted:
960 for fn2, fn in zip(fullNames, files): 981 for fn2, fn in zip(fullNames, files):
961 self.closeSourceWindow.emit(fn2) 982 self.closeSourceWindow.emit(fn2)
962 self.project.deleteFile(fn) 983 self.project.deleteFile(fn)
963 984
964 ########################################################################### 985 ###########################################################################
965 ## Methods for the Checks submenu 986 ## Methods for the Checks submenu
966 ########################################################################### 987 ###########################################################################
967 988
968 def __showContextMenuCheck(self): 989 def __showContextMenuCheck(self):
969 """ 990 """
970 Private slot called before the checks menu is shown. 991 Private slot called before the checks menu is shown.
971 """ 992 """
972 self.showMenu.emit("Checks", self.checksMenu) 993 self.showMenu.emit("Checks", self.checksMenu)
973 994
974 ########################################################################### 995 ###########################################################################
975 ## Methods for the Show submenu 996 ## Methods for the Show submenu
976 ########################################################################### 997 ###########################################################################
977 998
978 def __showCodeMetrics(self): 999 def __showCodeMetrics(self):
979 """ 1000 """
980 Private method to handle the code metrics context menu action. 1001 Private method to handle the code metrics context menu action.
981 """ 1002 """
982 itm = self.model().item(self.currentIndex()) 1003 itm = self.model().item(self.currentIndex())
983 fn = itm.fileName() 1004 fn = itm.fileName()
984 1005
985 from DataViews.CodeMetricsDialog import CodeMetricsDialog 1006 from DataViews.CodeMetricsDialog import CodeMetricsDialog
1007
986 self.codemetrics = CodeMetricsDialog() 1008 self.codemetrics = CodeMetricsDialog()
987 self.codemetrics.show() 1009 self.codemetrics.show()
988 self.codemetrics.start(fn) 1010 self.codemetrics.start(fn)
989 1011
990 def __showCodeCoverage(self): 1012 def __showCodeCoverage(self):
991 """ 1013 """
992 Private method to handle the code coverage context menu action. 1014 Private method to handle the code coverage context menu action.
993 """ 1015 """
994 itm = self.model().item(self.currentIndex()) 1016 itm = self.model().item(self.currentIndex())
995 fn = itm.fileName() 1017 fn = itm.fileName()
996 pfn = self.project.getMainScript(True) 1018 pfn = self.project.getMainScript(True)
997 1019
998 files = set() 1020 files = set()
999 1021
1000 if pfn is not None: 1022 if pfn is not None:
1001 files |= set(Utilities.getCoverageFileNames(pfn)) 1023 files |= set(Utilities.getCoverageFileNames(pfn))
1002 1024
1003 if fn is not None: 1025 if fn is not None:
1004 files |= set(Utilities.getCoverageFileNames(fn)) 1026 files |= set(Utilities.getCoverageFileNames(fn))
1005 1027
1006 if list(files): 1028 if list(files):
1007 if len(files) > 1: 1029 if len(files) > 1:
1008 cfn, ok = QInputDialog.getItem( 1030 cfn, ok = QInputDialog.getItem(
1009 None, 1031 None,
1010 self.tr("Code Coverage"), 1032 self.tr("Code Coverage"),
1011 self.tr("Please select a coverage file"), 1033 self.tr("Please select a coverage file"),
1012 files, 1034 files,
1013 0, False) 1035 0,
1036 False,
1037 )
1014 if not ok: 1038 if not ok:
1015 return 1039 return
1016 else: 1040 else:
1017 cfn = files[0] 1041 cfn = files[0]
1018 else: 1042 else:
1019 return 1043 return
1020 1044
1021 from DataViews.PyCoverageDialog import PyCoverageDialog 1045 from DataViews.PyCoverageDialog import PyCoverageDialog
1046
1022 self.codecoverage = PyCoverageDialog() 1047 self.codecoverage = PyCoverageDialog()
1023 self.codecoverage.show() 1048 self.codecoverage.show()
1024 self.codecoverage.start(cfn, fn) 1049 self.codecoverage.start(cfn, fn)
1025 1050
1026 def __showProfileData(self): 1051 def __showProfileData(self):
1027 """ 1052 """
1028 Private method to handle the show profile data context menu action. 1053 Private method to handle the show profile data context menu action.
1029 """ 1054 """
1030 itm = self.model().item(self.currentIndex()) 1055 itm = self.model().item(self.currentIndex())
1031 fn = itm.fileName() 1056 fn = itm.fileName()
1032 pfn = self.project.getMainScript(True) 1057 pfn = self.project.getMainScript(True)
1033 1058
1034 files = set() 1059 files = set()
1035 1060
1036 if pfn is not None: 1061 if pfn is not None:
1037 files |= set(Utilities.getProfileFileNames(pfn)) 1062 files |= set(Utilities.getProfileFileNames(pfn))
1038 1063
1039 if fn is not None: 1064 if fn is not None:
1040 files |= set(Utilities.getProfileFileNames(fn)) 1065 files |= set(Utilities.getProfileFileNames(fn))
1041 1066
1042 if list(files): 1067 if list(files):
1043 if len(files) > 1: 1068 if len(files) > 1:
1044 pfn, ok = QInputDialog.getItem( 1069 pfn, ok = QInputDialog.getItem(
1045 None, 1070 None,
1046 self.tr("Profile Data"), 1071 self.tr("Profile Data"),
1047 self.tr("Please select a profile file"), 1072 self.tr("Please select a profile file"),
1048 files, 1073 files,
1049 0, False) 1074 0,
1075 False,
1076 )
1050 if not ok: 1077 if not ok:
1051 return 1078 return
1052 else: 1079 else:
1053 pfn = files[0] 1080 pfn = files[0]
1054 else: 1081 else:
1055 return 1082 return
1056 1083
1057 from DataViews.PyProfileDialog import PyProfileDialog 1084 from DataViews.PyProfileDialog import PyProfileDialog
1085
1058 self.profiledata = PyProfileDialog() 1086 self.profiledata = PyProfileDialog()
1059 self.profiledata.show() 1087 self.profiledata.show()
1060 self.profiledata.start(pfn, fn) 1088 self.profiledata.start(pfn, fn)
1061 1089
1062 ########################################################################### 1090 ###########################################################################
1063 ## Methods for the Graphics submenu 1091 ## Methods for the Graphics submenu
1064 ########################################################################### 1092 ###########################################################################
1065 1093
1066 def __showContextMenuGraphics(self): 1094 def __showContextMenuGraphics(self):
1067 """ 1095 """
1068 Private slot called before the checks menu is shown. 1096 Private slot called before the checks menu is shown.
1069 """ 1097 """
1070 self.showMenu.emit("Graphics", self.graphicsMenu) 1098 self.showMenu.emit("Graphics", self.graphicsMenu)
1071 1099
1072 def __showClassDiagram(self): 1100 def __showClassDiagram(self):
1073 """ 1101 """
1074 Private method to handle the class diagram context menu action. 1102 Private method to handle the class diagram context menu action.
1075 """ 1103 """
1076 itm = self.model().item(self.currentIndex()) 1104 itm = self.model().item(self.currentIndex())
1080 fn = itm.dirName() 1108 fn = itm.dirName()
1081 res = EricMessageBox.yesNo( 1109 res = EricMessageBox.yesNo(
1082 self, 1110 self,
1083 self.tr("Class Diagram"), 1111 self.tr("Class Diagram"),
1084 self.tr("""Include class attributes?"""), 1112 self.tr("""Include class attributes?"""),
1085 yesDefault=True) 1113 yesDefault=True,
1086 1114 )
1115
1087 from Graphics.UMLDialog import UMLDialog, UMLDialogType 1116 from Graphics.UMLDialog import UMLDialog, UMLDialogType
1117
1088 self.classDiagram = UMLDialog( 1118 self.classDiagram = UMLDialog(
1089 UMLDialogType.CLASS_DIAGRAM, self.project, fn, 1119 UMLDialogType.CLASS_DIAGRAM, self.project, fn, self, noAttrs=not res
1090 self, noAttrs=not res) 1120 )
1091 self.classDiagram.show() 1121 self.classDiagram.show()
1092 1122
1093 def __showImportsDiagram(self): 1123 def __showImportsDiagram(self):
1094 """ 1124 """
1095 Private method to handle the imports diagram context menu action. 1125 Private method to handle the imports diagram context menu action.
1096 """ 1126 """
1097 itm = self.model().item(self.currentIndex()) 1127 itm = self.model().item(self.currentIndex())
1101 fn = itm.dirName() 1131 fn = itm.dirName()
1102 package = fn if os.path.isdir(fn) else os.path.dirname(fn) 1132 package = fn if os.path.isdir(fn) else os.path.dirname(fn)
1103 res = EricMessageBox.yesNo( 1133 res = EricMessageBox.yesNo(
1104 self, 1134 self,
1105 self.tr("Imports Diagram"), 1135 self.tr("Imports Diagram"),
1106 self.tr("""Include imports from external modules?""")) 1136 self.tr("""Include imports from external modules?"""),
1107 1137 )
1138
1108 from Graphics.UMLDialog import UMLDialog, UMLDialogType 1139 from Graphics.UMLDialog import UMLDialog, UMLDialogType
1140
1109 self.importsDiagram = UMLDialog( 1141 self.importsDiagram = UMLDialog(
1110 UMLDialogType.IMPORTS_DIAGRAM, self.project, package, 1142 UMLDialogType.IMPORTS_DIAGRAM,
1111 self, showExternalImports=res) 1143 self.project,
1144 package,
1145 self,
1146 showExternalImports=res,
1147 )
1112 self.importsDiagram.show() 1148 self.importsDiagram.show()
1113 1149
1114 def __showPackageDiagram(self): 1150 def __showPackageDiagram(self):
1115 """ 1151 """
1116 Private method to handle the package diagram context menu action. 1152 Private method to handle the package diagram context menu action.
1117 """ 1153 """
1118 itm = self.model().item(self.currentIndex()) 1154 itm = self.model().item(self.currentIndex())
1123 package = fn if os.path.isdir(fn) else os.path.dirname(fn) 1159 package = fn if os.path.isdir(fn) else os.path.dirname(fn)
1124 res = EricMessageBox.yesNo( 1160 res = EricMessageBox.yesNo(
1125 self, 1161 self,
1126 self.tr("Package Diagram"), 1162 self.tr("Package Diagram"),
1127 self.tr("""Include class attributes?"""), 1163 self.tr("""Include class attributes?"""),
1128 yesDefault=True) 1164 yesDefault=True,
1129 1165 )
1166
1130 from Graphics.UMLDialog import UMLDialog, UMLDialogType 1167 from Graphics.UMLDialog import UMLDialog, UMLDialogType
1168
1131 self.packageDiagram = UMLDialog( 1169 self.packageDiagram = UMLDialog(
1132 UMLDialogType.PACKAGE_DIAGRAM, self.project, package, 1170 UMLDialogType.PACKAGE_DIAGRAM, self.project, package, self, noAttrs=not res
1133 self, noAttrs=not res) 1171 )
1134 self.packageDiagram.show() 1172 self.packageDiagram.show()
1135 1173
1136 def __showApplicationDiagram(self): 1174 def __showApplicationDiagram(self):
1137 """ 1175 """
1138 Private method to handle the application diagram context menu action. 1176 Private method to handle the application diagram context menu action.
1139 """ 1177 """
1140 res = EricMessageBox.yesNo( 1178 res = EricMessageBox.yesNo(
1141 self, 1179 self,
1142 self.tr("Application Diagram"), 1180 self.tr("Application Diagram"),
1143 self.tr("""Include module names?"""), 1181 self.tr("""Include module names?"""),
1144 yesDefault=True) 1182 yesDefault=True,
1145 1183 )
1184
1146 from Graphics.UMLDialog import UMLDialog, UMLDialogType 1185 from Graphics.UMLDialog import UMLDialog, UMLDialogType
1186
1147 self.applicationDiagram = UMLDialog( 1187 self.applicationDiagram = UMLDialog(
1148 UMLDialogType.APPLICATION_DIAGRAM, self.project, 1188 UMLDialogType.APPLICATION_DIAGRAM, self.project, self, noModules=not res
1149 self, noModules=not res) 1189 )
1150 self.applicationDiagram.show() 1190 self.applicationDiagram.show()
1151 1191
1152 def __loadDiagram(self): 1192 def __loadDiagram(self):
1153 """ 1193 """
1154 Private slot to load a diagram from file. 1194 Private slot to load a diagram from file.
1155 """ 1195 """
1156 from Graphics.UMLDialog import UMLDialog, UMLDialogType 1196 from Graphics.UMLDialog import UMLDialog, UMLDialogType
1197
1157 self.loadedDiagram = None 1198 self.loadedDiagram = None
1158 loadedDiagram = UMLDialog( 1199 loadedDiagram = UMLDialog(UMLDialogType.NO_DIAGRAM, self.project, parent=self)
1159 UMLDialogType.NO_DIAGRAM, self.project, parent=self)
1160 if loadedDiagram.load(): 1200 if loadedDiagram.load():
1161 self.loadedDiagram = loadedDiagram 1201 self.loadedDiagram = loadedDiagram
1162 self.loadedDiagram.show(fromFile=True) 1202 self.loadedDiagram.show(fromFile=True)
1163 1203
1164 ########################################################################### 1204 ###########################################################################
1165 ## Methods for the Start submenu 1205 ## Methods for the Start submenu
1166 ########################################################################### 1206 ###########################################################################
1167 1207
1168 def __contextMenuRunScript(self): 1208 def __contextMenuRunScript(self):
1169 """ 1209 """
1170 Private method to run the editor script. 1210 Private method to run the editor script.
1171 """ 1211 """
1172 fn = self.model().item(self.currentIndex()).fileName() 1212 fn = self.model().item(self.currentIndex()).fileName()
1173 ericApp().getObject("DebugUI").doRun(False, script=fn) 1213 ericApp().getObject("DebugUI").doRun(False, script=fn)
1174 1214
1175 def __contextMenuDebugScript(self): 1215 def __contextMenuDebugScript(self):
1176 """ 1216 """
1177 Private method to debug the editor script. 1217 Private method to debug the editor script.
1178 """ 1218 """
1179 fn = self.model().item(self.currentIndex()).fileName() 1219 fn = self.model().item(self.currentIndex()).fileName()
1180 ericApp().getObject("DebugUI").doDebug(False, script=fn) 1220 ericApp().getObject("DebugUI").doDebug(False, script=fn)
1181 1221
1182 def __contextMenuProfileScript(self): 1222 def __contextMenuProfileScript(self):
1183 """ 1223 """
1184 Private method to profile the editor script. 1224 Private method to profile the editor script.
1185 """ 1225 """
1186 fn = self.model().item(self.currentIndex()).fileName() 1226 fn = self.model().item(self.currentIndex()).fileName()
1187 ericApp().getObject("DebugUI").doProfile(False, script=fn) 1227 ericApp().getObject("DebugUI").doProfile(False, script=fn)
1188 1228
1189 def __contextMenuCoverageScript(self): 1229 def __contextMenuCoverageScript(self):
1190 """ 1230 """
1191 Private method to run a coverage test of the editor script. 1231 Private method to run a coverage test of the editor script.
1192 """ 1232 """
1193 fn = self.model().item(self.currentIndex()).fileName() 1233 fn = self.model().item(self.currentIndex()).fileName()
1194 ericApp().getObject("DebugUI").doCoverage(False, script=fn) 1234 ericApp().getObject("DebugUI").doCoverage(False, script=fn)
1195 1235
1196 ########################################################################### 1236 ###########################################################################
1197 ## Methods for the Code Formatting submenu 1237 ## Methods for the Code Formatting submenu
1198 ########################################################################### 1238 ###########################################################################
1199 1239
1200 def __showContextMenuFormatting(self): 1240 def __showContextMenuFormatting(self):
1201 """ 1241 """
1202 Private slot called before the Code Formatting menu is shown. 1242 Private slot called before the Code Formatting menu is shown.
1203 """ 1243 """
1204 self.showMenu.emit("Formatting", self.formattingMenu) 1244 self.showMenu.emit("Formatting", self.formattingMenu)
1205 1245
1206 def __performFormatWithBlack(self, action): 1246 def __performFormatWithBlack(self, action):
1207 """ 1247 """
1208 Private method to format the selected project sources using the 'Black' tool. 1248 Private method to format the selected project sources using the 'Black' tool.
1209 1249
1210 Following actions are supported. 1250 Following actions are supported.
1211 <ul> 1251 <ul>
1212 <li>BlackFormattingAction.Format - the code reformatting is performed</li> 1252 <li>BlackFormattingAction.Format - the code reformatting is performed</li>
1213 <li>BlackFormattingAction.Check - a check is performed, if code formatting 1253 <li>BlackFormattingAction.Check - a check is performed, if code formatting
1214 is necessary</li> 1254 is necessary</li>
1215 <li>BlackFormattingAction.Diff - a unified diff of potential code formatting 1255 <li>BlackFormattingAction.Diff - a unified diff of potential code formatting
1216 changes is generated</li> 1256 changes is generated</li>
1217 </ul> 1257 </ul>
1218 1258
1219 @param action formatting operation to be performed 1259 @param action formatting operation to be performed
1220 @type BlackFormattingAction 1260 @type BlackFormattingAction
1221 """ 1261 """
1222 from CodeFormatting.BlackConfigurationDialog import BlackConfigurationDialog 1262 from CodeFormatting.BlackConfigurationDialog import BlackConfigurationDialog
1223 from CodeFormatting.BlackFormattingDialog import BlackFormattingDialog 1263 from CodeFormatting.BlackFormattingDialog import BlackFormattingDialog
1224 1264
1225 files = [ 1265 files = [
1226 itm.fileName() 1266 itm.fileName()
1227 for itm in self.getSelectedItems( 1267 for itm in self.getSelectedItems(
1228 [BrowserFileItem, BrowserClassItem, BrowserMethodItem, 1268 [
1229 BrowserClassAttributeItem, BrowserImportItem] 1269 BrowserFileItem,
1270 BrowserClassItem,
1271 BrowserMethodItem,
1272 BrowserClassAttributeItem,
1273 BrowserImportItem,
1274 ]
1230 ) 1275 )
1231 if itm.isPython3File() 1276 if itm.isPython3File()
1232 ] 1277 ]
1233 if not files: 1278 if not files:
1234 # called for a directory 1279 # called for a directory
1237 files = [ 1282 files = [
1238 f 1283 f
1239 for f in self.project.getProjectFiles("SOURCES", normalized=True) 1284 for f in self.project.getProjectFiles("SOURCES", normalized=True)
1240 if f.startswith(dirName) 1285 if f.startswith(dirName)
1241 ] 1286 ]
1242 1287
1243 if ericApp().getObject("ViewManager").checkAllDirty(): 1288 if ericApp().getObject("ViewManager").checkAllDirty():
1244 dlg = BlackConfigurationDialog(withProject=True) 1289 dlg = BlackConfigurationDialog(withProject=True)
1245 if dlg.exec() == QDialog.DialogCode.Accepted: 1290 if dlg.exec() == QDialog.DialogCode.Accepted:
1246 config = dlg.getConfiguration() 1291 config = dlg.getConfiguration()
1247 1292
1248 formattingDialog = BlackFormattingDialog( 1293 formattingDialog = BlackFormattingDialog(
1249 config, 1294 config, files, project=self.project, action=action
1250 files,
1251 project=self.project,
1252 action=action
1253 ) 1295 )
1254 formattingDialog.exec() 1296 formattingDialog.exec()

eric ide

mercurial