15 from PyQt6.QtCore import QProcess, QThread, pyqtSignal |
15 from PyQt6.QtCore import QProcess, QThread, pyqtSignal |
16 from PyQt6.QtWidgets import QApplication, QDialog, QMenu |
16 from PyQt6.QtWidgets import QApplication, QDialog, QMenu |
17 |
17 |
18 from eric7 import Preferences |
18 from eric7 import Preferences |
19 from eric7.EricGui import EricPixmapCache |
19 from eric7.EricGui import EricPixmapCache |
20 from eric7.EricWidgets import EricMessageBox |
20 from eric7.EricWidgets import EricMessageBox, EricPathPickerDialog |
21 from eric7.EricWidgets.EricApplication import ericApp |
21 from eric7.EricWidgets.EricApplication import ericApp |
|
22 from eric7.EricWidgets.EricPathPickerDialog import EricPathPickerModes |
22 from eric7.EricWidgets.EricProgressDialog import EricProgressDialog |
23 from eric7.EricWidgets.EricProgressDialog import EricProgressDialog |
23 from eric7.Project.FileCategoryRepositoryItem import FileCategoryRepositoryItem |
24 from eric7.Project.FileCategoryRepositoryItem import FileCategoryRepositoryItem |
24 from eric7.Project.ProjectBaseBrowser import ProjectBaseBrowser |
25 from eric7.Project.ProjectBaseBrowser import ProjectBaseBrowser |
25 from eric7.Project.ProjectBrowserModel import ( |
26 from eric7.Project.ProjectBrowserModel import ( |
26 ProjectBrowserDirectoryItem, |
27 ProjectBrowserDirectoryItem, |
217 self.menuActions.append(act) |
218 self.menuActions.append(act) |
218 act = self.sourceMenu.addAction(self.tr("Delete"), self.__deleteFile) |
219 act = self.sourceMenu.addAction(self.tr("Delete"), self.__deleteFile) |
219 self.menuActions.append(act) |
220 self.menuActions.append(act) |
220 self.sourceMenu.addSeparator() |
221 self.sourceMenu.addSeparator() |
221 self.sourceMenu.addAction( |
222 self.sourceMenu.addAction( |
|
223 self.tr("New interface file..."), self.__addNewInterfaceFile |
|
224 ) |
|
225 self.sourceMenu.addSeparator() |
|
226 self.sourceMenu.addAction( |
222 self.tr("Add interfaces..."), self.__addInterfaceFiles |
227 self.tr("Add interfaces..."), self.__addInterfaceFiles |
223 ) |
228 ) |
224 self.sourceMenu.addAction( |
229 self.sourceMenu.addAction( |
225 self.tr("Add interfaces directory..."), self.__addInterfacesDirectory |
230 self.tr("Add interfaces directory..."), self.__addInterfacesDirectory |
226 ) |
231 ) |
250 self.menu.addAction( |
255 self.menu.addAction( |
251 self.tr("Configure IDL compiler"), self.__configureIdlCompiler |
256 self.tr("Configure IDL compiler"), self.__configureIdlCompiler |
252 ) |
257 ) |
253 self.menu.addSeparator() |
258 self.menu.addSeparator() |
254 self.menu.addAction(self.tr("Open"), self._openItem) |
259 self.menu.addAction(self.tr("Open"), self._openItem) |
|
260 self.menu.addSeparator() |
|
261 self.menu.addAction( |
|
262 self.tr("New interface file..."), self.__addNewInterfaceFile |
|
263 ) |
255 self.menu.addSeparator() |
264 self.menu.addSeparator() |
256 self.menu.addAction(self.tr("Add interfaces..."), self.__addInterfaceFiles) |
265 self.menu.addAction(self.tr("Add interfaces..."), self.__addInterfaceFiles) |
257 self.menu.addAction( |
266 self.menu.addAction( |
258 self.tr("Add interfaces directory..."), self.__addInterfacesDirectory |
267 self.tr("Add interfaces directory..."), self.__addInterfacesDirectory |
259 ) |
268 ) |
273 self.backMenu.addSeparator() |
282 self.backMenu.addSeparator() |
274 self.backMenu.addAction( |
283 self.backMenu.addAction( |
275 self.tr("Configure IDL compiler"), self.__configureIdlCompiler |
284 self.tr("Configure IDL compiler"), self.__configureIdlCompiler |
276 ) |
285 ) |
277 self.backMenu.addSeparator() |
286 self.backMenu.addSeparator() |
|
287 self.backMenu.addAction( |
|
288 self.tr("New interface file..."), self.__addNewInterfaceFile |
|
289 ) |
|
290 self.backMenu.addSeparator() |
278 self.backMenu.addAction( |
291 self.backMenu.addAction( |
279 self.tr("Add interfaces..."), lambda: self.project.addFiles("INTERFACES") |
292 self.tr("Add interfaces..."), lambda: self.project.addFiles("INTERFACES") |
280 ) |
293 ) |
281 self.backMenu.addAction( |
294 self.backMenu.addAction( |
282 self.tr("Add interfaces directory..."), |
295 self.tr("Add interfaces directory..."), |
332 self.dirMenu.addSeparator() |
345 self.dirMenu.addSeparator() |
333 act = self.dirMenu.addAction(self.tr("Remove from project"), self._removeFile) |
346 act = self.dirMenu.addAction(self.tr("Remove from project"), self._removeFile) |
334 self.dirMenuActions.append(act) |
347 self.dirMenuActions.append(act) |
335 act = self.dirMenu.addAction(self.tr("Delete"), self._deleteDirectory) |
348 act = self.dirMenu.addAction(self.tr("Delete"), self._deleteDirectory) |
336 self.dirMenuActions.append(act) |
349 self.dirMenuActions.append(act) |
|
350 self.dirMenu.addSeparator() |
|
351 self.dirMenu.addAction( |
|
352 self.tr("New interface file..."), self.__addNewInterfaceFile |
|
353 ) |
337 self.dirMenu.addSeparator() |
354 self.dirMenu.addSeparator() |
338 self.dirMenu.addAction(self.tr("Add interfaces..."), self.__addInterfaceFiles) |
355 self.dirMenu.addAction(self.tr("Add interfaces..."), self.__addInterfaceFiles) |
339 self.dirMenu.addAction( |
356 self.dirMenu.addAction( |
340 self.tr("Add interfaces directory..."), self.__addInterfacesDirectory |
357 self.tr("Add interfaces directory..."), self.__addInterfacesDirectory |
341 ) |
358 ) |
516 elif isinstance(itm, BrowserClassAttributeItem): |
533 elif isinstance(itm, BrowserClassAttributeItem): |
517 self.sourceFile[str, int].emit( |
534 self.sourceFile[str, int].emit( |
518 itm.fileName(), itm.attributeObject().lineno |
535 itm.fileName(), itm.attributeObject().lineno |
519 ) |
536 ) |
520 |
537 |
|
538 def __addNewInterfaceFile(self): |
|
539 """ |
|
540 Private method to add a new interface file to the project. |
|
541 """ |
|
542 itm = self.model().item(self.currentIndex()) |
|
543 if isinstance( |
|
544 itm, (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem) |
|
545 ): |
|
546 dn = os.path.dirname(itm.fileName()) |
|
547 elif isinstance( |
|
548 itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem) |
|
549 ): |
|
550 dn = itm.dirName() |
|
551 else: |
|
552 dn = "" |
|
553 |
|
554 filename, ok = EricPathPickerDialog.getStrPath( |
|
555 self, |
|
556 self.tr("New interface file"), |
|
557 self.tr("Enter the path of the new interface file:"), |
|
558 mode=EricPathPickerModes.SAVE_FILE_ENSURE_EXTENSION_MODE, |
|
559 strPath=dn, |
|
560 defaultDirectory=dn, |
|
561 filters=self.project.getFileCategoryFilters( |
|
562 categories=["INTERFACES"], withAll=False |
|
563 ), |
|
564 ) |
|
565 if ok: |
|
566 if not os.path.splitext(filename)[1]: |
|
567 filename = filename + ".idl" |
|
568 |
|
569 if os.path.exists(filename): |
|
570 EricMessageBox.critical( |
|
571 self, |
|
572 self.tr("New interface file"), |
|
573 self.tr( |
|
574 "<p>The file <b>{0}</b> already exists. The action will be" |
|
575 " aborted.</p>" |
|
576 ).format(filename), |
|
577 ) |
|
578 return |
|
579 |
|
580 try: |
|
581 with open(filename, "w") as f: |
|
582 f.write("// {0}\n".format(self.project.getRelativePath(filename))) |
|
583 except OSError as err: |
|
584 EricMessageBox.critical( |
|
585 self, |
|
586 self.tr("New interface file"), |
|
587 self.tr( |
|
588 "<p>The file <b>{0}</b> could not be created. Aborting...</p>" |
|
589 "<p>Reason: {1}</p>" |
|
590 ).format(filename, str(err)), |
|
591 ) |
|
592 return |
|
593 |
|
594 self.project.appendFile(filename) |
|
595 self.sourceFile[str].emit(filename) |
|
596 |
521 def __addInterfaceFiles(self): |
597 def __addInterfaceFiles(self): |
522 """ |
598 """ |
523 Private method to add interface files to the project. |
599 Private method to add interface files to the project. |
524 """ |
600 """ |
525 itm = self.model().item(self.currentIndex()) |
601 itm = self.model().item(self.currentIndex()) |