ExtensionProtobuf/ProjectProtocolsBrowser.py

changeset 27
5e9a61e7d7d0
parent 23
7bfac64d06ff
child 34
41070d80eb1f
diff -r 35f7cbb40a1f -r 5e9a61e7d7d0 ExtensionProtobuf/ProjectProtocolsBrowser.py
--- a/ExtensionProtobuf/ProjectProtocolsBrowser.py	Tue Oct 17 11:30:08 2023 +0200
+++ b/ExtensionProtobuf/ProjectProtocolsBrowser.py	Wed Oct 25 18:08:35 2023 +0200
@@ -18,8 +18,9 @@
 
 from eric7 import Preferences
 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.EricWidgets.EricProgressDialog import EricProgressDialog
 from eric7.Project.FileCategoryRepositoryItem import FileCategoryRepositoryItem
 from eric7.Project.ProjectBaseBrowser import ProjectBaseBrowser
@@ -211,6 +212,10 @@
         act = self.sourceMenu.addAction(self.tr("Delete"), self.__deleteFile)
         self.menuActions.append(act)
         self.sourceMenu.addSeparator()
+        self.sourceMenu.addAction(
+            self.tr("New protocol file..."), self.__addNewProtocolFile
+        )
+        self.sourceMenu.addSeparator()
         self.sourceMenu.addAction(self.tr("Add protocols..."), self.__addProtocolFiles)
         self.sourceMenu.addAction(
             self.tr("Add protocols directory..."), self.__addProtocolsDirectory
@@ -250,6 +255,8 @@
         self.menu.addSeparator()
         self.menu.addAction(self.tr("Open"), self._openItem)
         self.menu.addSeparator()
+        self.menu.addAction(self.tr("New protocol file..."), self.__addNewProtocolFile)
+        self.menu.addSeparator()
         self.menu.addAction(self.tr("Add protocols..."), self.__addProtocolFiles)
         self.menu.addAction(
             self.tr("Add protocols directory..."), self.__addProtocolsDirectory
@@ -273,6 +280,10 @@
         )
         self.backMenu.addSeparator()
         self.backMenu.addAction(
+            self.tr("New protocol file..."), self.__addNewProtocolFile
+        )
+        self.backMenu.addSeparator()
+        self.backMenu.addAction(
             self.tr("Add protocols..."), lambda: self.project.addFiles("PROTOCOLS")
         )
         self.backMenu.addAction(
@@ -335,6 +346,10 @@
         act = self.dirMenu.addAction(self.tr("Delete"), self._deleteDirectory)
         self.dirMenuActions.append(act)
         self.dirMenu.addSeparator()
+        self.dirMenu.addAction(
+            self.tr("New protocol file..."), self.__addNewProtocolFile
+        )
+        self.dirMenu.addSeparator()
         self.dirMenu.addAction(self.tr("Add protocols..."), self.__addProtocolFiles)
         self.dirMenu.addAction(
             self.tr("Add protocols directory..."), self.__addProtocolsDirectory
@@ -519,6 +534,66 @@
                     itm.fileName(), itm.attributeObject().lineno
                 )
 
+    def __addNewProtocolFile(self):
+        """
+        Private method to add a new interface 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 = ""
+
+        filename, ok = EricPathPickerDialog.getStrPath(
+            self,
+            self.tr("New protocol file"),
+            self.tr("Enter the path of the new protocol file:"),
+            mode=EricPathPickerModes.SAVE_FILE_ENSURE_EXTENSION_MODE,
+            strPath=dn,
+            defaultDirectory=dn,
+            filters=self.project.getFileCategoryFilters(
+                categories=["PROTOCOLS"], withAll=False
+            ),
+        )
+        if ok:
+            if not os.path.splitext(filename)[1]:
+                filename += ".proto"
+
+            if os.path.exists(filename):
+                EricMessageBox.critical(
+                    self,
+                    self.tr("New protocol 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("// {0}\n".format(self.project.getRelativePath(filename)))
+                    f.write('syntax = "proto2";\n')
+            except OSError as err:
+                EricMessageBox.critical(
+                    self,
+                    self.tr("New protocol 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 __addProtocolFiles(self):
         """
         Private method to add protocol files to the project.

eric ide

mercurial