src/eric7/Project/ProjectSourcesBrowser.py

branch
eric7-maintenance
changeset 10272
7ae72d1df070
parent 10148
31ba20629af4
parent 10256
1b728f26d1ae
child 10460
3b34efa2857c
--- a/src/eric7/Project/ProjectSourcesBrowser.py	Thu Oct 05 10:06:49 2023 +0200
+++ b/src/eric7/Project/ProjectSourcesBrowser.py	Tue Oct 31 09:22:17 2023 +0100
@@ -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):
         """

eric ide

mercurial