17 from eric7.CodeFormatting.BlackFormattingAction import BlackFormattingAction |
17 from eric7.CodeFormatting.BlackFormattingAction import BlackFormattingAction |
18 from eric7.CodeFormatting.BlackUtilities import aboutBlack |
18 from eric7.CodeFormatting.BlackUtilities import aboutBlack |
19 from eric7.CodeFormatting.IsortFormattingAction import IsortFormattingAction |
19 from eric7.CodeFormatting.IsortFormattingAction import IsortFormattingAction |
20 from eric7.CodeFormatting.IsortUtilities import aboutIsort |
20 from eric7.CodeFormatting.IsortUtilities import aboutIsort |
21 from eric7.EricGui import EricPixmapCache |
21 from eric7.EricGui import EricPixmapCache |
22 from eric7.EricWidgets import EricMessageBox |
22 from eric7.EricWidgets import EricMessageBox, EricPathPickerDialog |
23 from eric7.EricWidgets.EricApplication import ericApp |
23 from eric7.EricWidgets.EricApplication import ericApp |
|
24 from eric7.EricWidgets.EricPathPickerDialog import EricPathPickerModes |
24 from eric7.Graphics.UMLDialog import UMLDialog, UMLDialogType |
25 from eric7.Graphics.UMLDialog import UMLDialog, UMLDialogType |
25 from eric7.UI.BrowserModel import ( |
26 from eric7.UI.BrowserModel import ( |
26 BrowserClassAttributeItem, |
27 BrowserClassAttributeItem, |
27 BrowserClassItem, |
28 BrowserClassItem, |
28 BrowserFileItem, |
29 BrowserFileItem, |
32 from eric7.UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog |
33 from eric7.UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog |
33 |
34 |
34 from .FileCategoryRepositoryItem import FileCategoryRepositoryItem |
35 from .FileCategoryRepositoryItem import FileCategoryRepositoryItem |
35 from .ProjectBaseBrowser import ProjectBaseBrowser |
36 from .ProjectBaseBrowser import ProjectBaseBrowser |
36 from .ProjectBrowserModel import ( |
37 from .ProjectBrowserModel import ( |
37 ProjectBrowserDirectoryItem, |
|
38 ProjectBrowserFileItem, |
38 ProjectBrowserFileItem, |
39 ProjectBrowserSimpleDirectoryItem, |
39 ProjectBrowserSimpleDirectoryItem, |
40 ) |
40 ) |
41 from .ProjectBrowserRepositoryItem import ProjectBrowserRepositoryItem |
41 from .ProjectBrowserRepositoryItem import ProjectBrowserRepositoryItem |
42 |
42 |
304 self.menuActions.append(act) |
304 self.menuActions.append(act) |
305 act = self.sourceMenu.addAction(self.tr("Delete"), self.__deleteFile) |
305 act = self.sourceMenu.addAction(self.tr("Delete"), self.__deleteFile) |
306 self.menuActions.append(act) |
306 self.menuActions.append(act) |
307 self.sourceMenu.addSeparator() |
307 self.sourceMenu.addSeparator() |
308 self.sourceMenu.addAction(self.tr("New package..."), self.__addNewPackage) |
308 self.sourceMenu.addAction(self.tr("New package..."), self.__addNewPackage) |
|
309 self.sourceMenu.addAction( |
|
310 self.tr("New source file..."), self.__addNewSourceFile |
|
311 ) |
|
312 self.sourceMenu.addSeparator() |
309 self.sourceMenu.addAction(self.tr("Add source files..."), self.__addSourceFiles) |
313 self.sourceMenu.addAction(self.tr("Add source files..."), self.__addSourceFiles) |
310 self.sourceMenu.addAction( |
314 self.sourceMenu.addAction( |
311 self.tr("Add source directory..."), self.__addSourceDirectory |
315 self.tr("Add source directory..."), self.__addSourceDirectory |
312 ) |
316 ) |
313 self.sourceMenu.addSeparator() |
317 self.sourceMenu.addSeparator() |
332 self.sourceMenu.addSeparator() |
336 self.sourceMenu.addSeparator() |
333 self.sourceMenu.addAction(self.tr("Configure..."), self._configure) |
337 self.sourceMenu.addAction(self.tr("Configure..."), self._configure) |
334 |
338 |
335 self.menu.addSeparator() |
339 self.menu.addSeparator() |
336 self.menu.addAction(self.tr("New package..."), self.__addNewPackage) |
340 self.menu.addAction(self.tr("New package..."), self.__addNewPackage) |
|
341 self.menu.addAction(self.tr("New source file..."), self.__addNewSourceFile) |
|
342 self.menu.addSeparator() |
337 self.menu.addAction(self.tr("Add source files..."), self.__addSourceFiles) |
343 self.menu.addAction(self.tr("Add source files..."), self.__addSourceFiles) |
338 self.menu.addAction( |
344 self.menu.addAction( |
339 self.tr("Add source directory..."), self.__addSourceDirectory |
345 self.tr("Add source directory..."), self.__addSourceDirectory |
340 ) |
346 ) |
341 self.menu.addSeparator() |
347 self.menu.addSeparator() |
353 self.attributeMenu = QMenu(self) |
359 self.attributeMenu = QMenu(self) |
354 self.attributeMenu.addMenu(self.gotoMenu) |
360 self.attributeMenu.addMenu(self.gotoMenu) |
355 self.attributeMenu.addSeparator() |
361 self.attributeMenu.addSeparator() |
356 self.attributeMenu.addAction(self.tr("New package..."), self.__addNewPackage) |
362 self.attributeMenu.addAction(self.tr("New package..."), self.__addNewPackage) |
357 self.attributeMenu.addAction( |
363 self.attributeMenu.addAction( |
|
364 self.tr("New source file..."), self.__addNewSourceFile |
|
365 ) |
|
366 self.attributeMenu.addSeparator() |
|
367 self.attributeMenu.addAction( |
358 self.tr("Add source files..."), |
368 self.tr("Add source files..."), |
359 lambda: self.project.addFiles("SOURCES"), |
369 lambda: self.project.addFiles("SOURCES"), |
360 ) |
370 ) |
361 self.attributeMenu.addAction( |
371 self.attributeMenu.addAction( |
362 self.tr("Add source directory..."), |
372 self.tr("Add source directory..."), |
375 self.attributeMenu.addSeparator() |
385 self.attributeMenu.addSeparator() |
376 self.attributeMenu.addAction(self.tr("Configure..."), self._configure) |
386 self.attributeMenu.addAction(self.tr("Configure..."), self._configure) |
377 |
387 |
378 self.backMenu = QMenu(self) |
388 self.backMenu = QMenu(self) |
379 self.backMenu.addAction(self.tr("New package..."), self.__addNewPackage) |
389 self.backMenu.addAction(self.tr("New package..."), self.__addNewPackage) |
|
390 self.backMenu.addAction(self.tr("New source file..."), self.__addNewSourceFile) |
|
391 self.backMenu.addSeparator() |
380 self.backMenu.addAction( |
392 self.backMenu.addAction( |
381 self.tr("Add source files..."), |
393 self.tr("Add source files..."), |
382 lambda: self.project.addFiles("SOURCES"), |
394 lambda: self.project.addFiles("SOURCES"), |
383 ) |
395 ) |
384 self.backMenu.addAction( |
396 self.backMenu.addAction( |
417 self.dirMenuActions.append(act) |
429 self.dirMenuActions.append(act) |
418 act = self.dirMenu.addAction(self.tr("Delete"), self._deleteDirectory) |
430 act = self.dirMenu.addAction(self.tr("Delete"), self._deleteDirectory) |
419 self.dirMenuActions.append(act) |
431 self.dirMenuActions.append(act) |
420 self.dirMenu.addSeparator() |
432 self.dirMenu.addSeparator() |
421 self.dirMenu.addAction(self.tr("New package..."), self.__addNewPackage) |
433 self.dirMenu.addAction(self.tr("New package..."), self.__addNewPackage) |
|
434 self.dirMenu.addAction(self.tr("New source file..."), self.__addNewSourceFile) |
|
435 self.dirMenu.addSeparator() |
422 self.dirMenu.addAction(self.tr("Add source files..."), self.__addSourceFiles) |
436 self.dirMenu.addAction(self.tr("Add source files..."), self.__addSourceFiles) |
423 self.dirMenu.addAction( |
437 self.dirMenu.addAction( |
424 self.tr("Add source directory..."), self.__addSourceDirectory |
438 self.tr("Add source directory..."), self.__addSourceDirectory |
425 ) |
439 ) |
426 self.dirMenu.addSeparator() |
440 self.dirMenu.addSeparator() |
1001 """ |
1015 """ |
1002 Private method to add a new package to the project. |
1016 Private method to add a new package to the project. |
1003 """ |
1017 """ |
1004 from .NewPythonPackageDialog import NewPythonPackageDialog |
1018 from .NewPythonPackageDialog import NewPythonPackageDialog |
1005 |
1019 |
1006 itm = self.model().item(self.currentIndex()) |
1020 dn = self.currentDirectory(relative=True) |
1007 if isinstance( |
|
1008 itm, (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem) |
|
1009 ): |
|
1010 dn = os.path.dirname(itm.fileName()) |
|
1011 elif isinstance( |
|
1012 itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem) |
|
1013 ): |
|
1014 dn = itm.dirName() |
|
1015 else: |
|
1016 dn = "" |
|
1017 |
|
1018 dn = self.project.getRelativePath(dn) |
|
1019 if dn.startswith(os.sep): |
1021 if dn.startswith(os.sep): |
1020 dn = dn[1:] |
1022 dn = dn[1:] |
1021 dlg = NewPythonPackageDialog(dn, self) |
1023 dlg = NewPythonPackageDialog(dn, self) |
1022 if dlg.exec() == QDialog.DialogCode.Accepted: |
1024 if dlg.exec() == QDialog.DialogCode.Accepted: |
1023 packageName = dlg.getData() |
1025 packageName = dlg.getData() |
1058 return |
1060 return |
1059 self.project.appendFile(packageFile) |
1061 self.project.appendFile(packageFile) |
1060 if packageFile: |
1062 if packageFile: |
1061 self.sourceFile[str].emit(packageFile) |
1063 self.sourceFile[str].emit(packageFile) |
1062 |
1064 |
|
1065 def __addNewSourceFile(self): |
|
1066 """ |
|
1067 Private method to add a new source file to the project. |
|
1068 """ |
|
1069 dn = self.currentDirectory() |
|
1070 filename, ok = EricPathPickerDialog.getStrPath( |
|
1071 self, |
|
1072 self.tr("New source file"), |
|
1073 self.tr("Enter the path of the new source file:"), |
|
1074 mode=EricPathPickerModes.SAVE_FILE_ENSURE_EXTENSION_MODE, |
|
1075 strPath=dn, |
|
1076 defaultDirectory=dn, |
|
1077 filters=self.project.getFileCategoryFilters( |
|
1078 categories=["SOURCES"], withAll=False |
|
1079 ), |
|
1080 ) |
|
1081 if ok: |
|
1082 if os.path.exists(filename): |
|
1083 EricMessageBox.critical( |
|
1084 self, |
|
1085 self.tr("New source file"), |
|
1086 self.tr( |
|
1087 "<p>The file <b>{0}</b> already exists. The action will be" |
|
1088 " aborted.</p>" |
|
1089 ).format(filename), |
|
1090 ) |
|
1091 return |
|
1092 |
|
1093 try: |
|
1094 with open(filename, "w") as f: |
|
1095 f.write("# -*- coding: utf-8 -*-\n") |
|
1096 f.write("# {0}\n".format(self.project.getRelativePath(filename))) |
|
1097 except OSError as err: |
|
1098 EricMessageBox.critical( |
|
1099 self, |
|
1100 self.tr("New source file"), |
|
1101 self.tr( |
|
1102 "<p>The file <b>{0}</b> could not be created. Aborting...</p>" |
|
1103 "<p>Reason: {1}</p>" |
|
1104 ).format(filename, str(err)), |
|
1105 ) |
|
1106 return |
|
1107 |
|
1108 self.project.appendFile(filename) |
|
1109 self.sourceFile[str].emit(filename) |
|
1110 |
1063 def __addSourceFiles(self): |
1111 def __addSourceFiles(self): |
1064 """ |
1112 """ |
1065 Private method to add a source file to the project. |
1113 Private method to add a source file to the project. |
1066 """ |
1114 """ |
1067 itm = self.model().item(self.currentIndex()) |
1115 self.project.addFiles("SOURCES", self.currentDirectory()) |
1068 if isinstance( |
|
1069 itm, (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem) |
|
1070 ): |
|
1071 dn = os.path.dirname(itm.fileName()) |
|
1072 elif isinstance( |
|
1073 itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem) |
|
1074 ): |
|
1075 dn = itm.dirName() |
|
1076 else: |
|
1077 dn = None |
|
1078 self.project.addFiles("SOURCES", dn) |
|
1079 |
1116 |
1080 def __addSourceDirectory(self): |
1117 def __addSourceDirectory(self): |
1081 """ |
1118 """ |
1082 Private method to add source files of a directory to the project. |
1119 Private method to add source files of a directory to the project. |
1083 """ |
1120 """ |
1084 itm = self.model().item(self.currentIndex()) |
1121 self.project.addDirectory("SOURCES", self.currentDirectory()) |
1085 if isinstance( |
|
1086 itm, (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem) |
|
1087 ): |
|
1088 dn = os.path.dirname(itm.fileName()) |
|
1089 elif isinstance( |
|
1090 itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem) |
|
1091 ): |
|
1092 dn = itm.dirName() |
|
1093 else: |
|
1094 dn = None |
|
1095 self.project.addDirectory("SOURCES", dn) |
|
1096 |
1122 |
1097 def __deleteFile(self): |
1123 def __deleteFile(self): |
1098 """ |
1124 """ |
1099 Private method to delete files from the project. |
1125 Private method to delete files from the project. |
1100 """ |
1126 """ |