--- a/src/eric7/Project/ProjectSourcesBrowser.py Tue Oct 24 11:45:39 2023 +0200 +++ b/src/eric7/Project/ProjectSourcesBrowser.py Wed Oct 25 14:30:33 2023 +0200 @@ -19,8 +19,9 @@ from eric7.CodeFormatting.IsortFormattingAction import IsortFormattingAction from eric7.CodeFormatting.IsortUtilities import aboutIsort from eric7.EricGui import EricPixmapCache -from eric7.EricWidgets import EricMessageBox +from eric7.EricWidgets import EricMessageBox, EricPathPickerDialog from eric7.EricWidgets.EricApplication import ericApp +from eric7.EricWidgets.EricPathPickerDialog import EricPathPickerModes from eric7.Graphics.UMLDialog import UMLDialog, UMLDialogType from eric7.UI.BrowserModel import ( BrowserClassAttributeItem, @@ -34,7 +35,6 @@ from .FileCategoryRepositoryItem import FileCategoryRepositoryItem from .ProjectBaseBrowser import ProjectBaseBrowser from .ProjectBrowserModel import ( - ProjectBrowserDirectoryItem, ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem, ) @@ -306,6 +306,10 @@ self.menuActions.append(act) self.sourceMenu.addSeparator() self.sourceMenu.addAction(self.tr("New package..."), self.__addNewPackage) + self.sourceMenu.addAction( + self.tr("New source file..."), self.__addNewSourceFile + ) + self.sourceMenu.addSeparator() self.sourceMenu.addAction(self.tr("Add source files..."), self.__addSourceFiles) self.sourceMenu.addAction( self.tr("Add source directory..."), self.__addSourceDirectory @@ -334,6 +338,8 @@ self.menu.addSeparator() self.menu.addAction(self.tr("New package..."), self.__addNewPackage) + self.menu.addAction(self.tr("New source file..."), self.__addNewSourceFile) + self.menu.addSeparator() self.menu.addAction(self.tr("Add source files..."), self.__addSourceFiles) self.menu.addAction( self.tr("Add source directory..."), self.__addSourceDirectory @@ -355,6 +361,10 @@ self.attributeMenu.addSeparator() self.attributeMenu.addAction(self.tr("New package..."), self.__addNewPackage) self.attributeMenu.addAction( + self.tr("New source file..."), self.__addNewSourceFile + ) + self.attributeMenu.addSeparator() + self.attributeMenu.addAction( self.tr("Add source files..."), lambda: self.project.addFiles("SOURCES"), ) @@ -377,6 +387,8 @@ self.backMenu = QMenu(self) self.backMenu.addAction(self.tr("New package..."), self.__addNewPackage) + self.backMenu.addAction(self.tr("New source file..."), self.__addNewSourceFile) + self.backMenu.addSeparator() self.backMenu.addAction( self.tr("Add source files..."), lambda: self.project.addFiles("SOURCES"), @@ -419,6 +431,8 @@ self.dirMenuActions.append(act) self.dirMenu.addSeparator() self.dirMenu.addAction(self.tr("New package..."), self.__addNewPackage) + self.dirMenu.addAction(self.tr("New source file..."), self.__addNewSourceFile) + self.dirMenu.addSeparator() self.dirMenu.addAction(self.tr("Add source files..."), self.__addSourceFiles) self.dirMenu.addAction( self.tr("Add source directory..."), self.__addSourceDirectory @@ -1003,19 +1017,7 @@ """ from .NewPythonPackageDialog import NewPythonPackageDialog - itm = self.model().item(self.currentIndex()) - if isinstance( - itm, (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem) - ): - dn = os.path.dirname(itm.fileName()) - elif isinstance( - itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem) - ): - dn = itm.dirName() - else: - dn = "" - - dn = self.project.getRelativePath(dn) + dn = self.currentDirectory(relative=True) if dn.startswith(os.sep): dn = dn[1:] dlg = NewPythonPackageDialog(dn, self) @@ -1060,39 +1062,63 @@ if packageFile: self.sourceFile[str].emit(packageFile) + def __addNewSourceFile(self): + """ + Private method to add a new source file to the project. + """ + dn = self.currentDirectory() + filename, ok = EricPathPickerDialog.getStrPath( + self, + self.tr("New source file"), + self.tr("Enter the path of the new source file:"), + mode=EricPathPickerModes.SAVE_FILE_ENSURE_EXTENSION_MODE, + strPath=dn, + defaultDirectory=dn, + filters=self.project.getFileCategoryFilters( + categories=["SOURCES"], withAll=False + ), + ) + if ok: + if os.path.exists(filename): + EricMessageBox.critical( + self, + self.tr("New source file"), + self.tr( + "<p>The file <b>{0}</b> already exists. The action will be" + " aborted.</p>" + ).format(filename), + ) + return + + try: + with open(filename, "w") as f: + f.write("# -*- coding: utf-8 -*-\n") + f.write("# {0}\n".format(self.project.getRelativePath(filename))) + except OSError as err: + EricMessageBox.critical( + self, + self.tr("New source file"), + self.tr( + "<p>The file <b>{0}</b> could not be created. Aborting...</p>" + "<p>Reason: {1}</p>" + ).format(filename, str(err)), + ) + return + + self.project.appendFile(filename) + self.sourceFile[str].emit(filename) + def __addSourceFiles(self): """ Private method to add a source file to the project. """ - itm = self.model().item(self.currentIndex()) - if isinstance( - itm, (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem) - ): - dn = os.path.dirname(itm.fileName()) - elif isinstance( - itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem) - ): - dn = itm.dirName() - else: - dn = None - self.project.addFiles("SOURCES", dn) + self.project.addFiles("SOURCES", self.currentDirectory()) def __addSourceDirectory(self): """ Private method to add source files of a directory to the project. """ - itm = self.model().item(self.currentIndex()) - if isinstance( - itm, (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem) - ): - dn = os.path.dirname(itm.fileName()) - elif isinstance( - itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem) - ): - dn = itm.dirName() - else: - dn = None - self.project.addDirectory("SOURCES", dn) + self.project.addDirectory("SOURCES", self.currentDirectory()) def __deleteFile(self): """