src/eric7/QScintilla/MiniEditor.py

branch
eric7
changeset 10518
1682f3203ae5
parent 10439
21c28b0f9e41
child 10523
e4069ddd7dc7
diff -r aecd5a8c958c -r 1682f3203ae5 src/eric7/QScintilla/MiniEditor.py
--- a/src/eric7/QScintilla/MiniEditor.py	Sun Jan 21 13:00:42 2024 +0100
+++ b/src/eric7/QScintilla/MiniEditor.py	Sun Jan 21 15:38:51 2024 +0100
@@ -38,6 +38,7 @@
     QHBoxLayout,
     QInputDialog,
     QLabel,
+    QLineEdit,
     QMenu,
     QVBoxLayout,
     QWhatsThis,
@@ -49,10 +50,11 @@
 from eric7.EricGui.EricAction import EricAction, createActionGroup
 from eric7.EricGui.EricOverrideCursor import EricOverrideCursor
 from eric7.EricWidgets import EricFileDialog, EricMessageBox
+from eric7.EricWidgets.EricApplication import ericApp
 from eric7.EricWidgets.EricClickableLabel import EricClickableLabel
 from eric7.EricWidgets.EricMainWindow import EricMainWindow
 from eric7.EricWidgets.EricZoomWidget import EricZoomWidget
-from eric7.SystemUtilities import OSUtilities
+from eric7.SystemUtilities import FileSystemUtilities, OSUtilities
 
 from . import Lexers
 from .EditorOutline import EditorOutlineView
@@ -252,6 +254,7 @@
     @signal editorRenamed(str) emitted after the editor got a new name
         (i.e. after a 'Save As')
     @signal cursorLineChanged(int) emitted when the cursor line was changed
+    @signal closing() emitted when the editor is closed
 
     @signal refreshed() dummy signal to emulate the Editor interface
     """
@@ -260,6 +263,7 @@
     languageChanged = pyqtSignal(str)
     editorRenamed = pyqtSignal(str)
     cursorLineChanged = pyqtSignal(int)
+    closing = pyqtSignal()
 
     refreshed = pyqtSignal()
 
@@ -372,7 +376,10 @@
         )
 
         if filename:
-            self.__loadFile(filename, filetype)
+            if FileSystemUtilities.isPlainFileName(filename):
+                self.__loadFile(filename, filetype)
+            else:
+                self.__setCurrentFile(filename)
         else:
             self.__setCurrentFile("")
             self.encoding = self.__getEditorConfig("DefaultEncoding")
@@ -397,6 +404,7 @@
         if self.__maybeSave():
             self.__writeSettings()
             event.accept()
+            self.closing.emit()
         else:
             event.ignore()
 
@@ -430,7 +438,10 @@
         if not self.__curFile:
             return self.__saveAs()
         else:
-            return self.__saveFile(self.__curFile)
+            if FileSystemUtilities.isDeviceFileName(self.__curFile):
+                return self.__saveDeviceFile(saveas=False)
+            else:
+                return self.__saveFile(self.__curFile)
 
     def __saveAs(self):
         """
@@ -439,15 +450,18 @@
         @return flag indicating success
         @rtype bool
         """
-        fileName = EricFileDialog.getSaveFileName(self)
-        if not fileName:
-            return False
-
-        result = self.__saveFile(fileName)
-
-        self.editorRenamed.emit(fileName)
-
-        return result
+        if self.__curFile and FileSystemUtilities.isDeviceFileName(self.__curFile):
+            return self.__saveDeviceFile(saveas=True)
+        else:
+            fileName = EricFileDialog.getSaveFileName(self)
+            if not fileName:
+                return False
+
+            result = self.__saveFile(fileName)
+
+            self.editorRenamed.emit(fileName)
+
+            return result
 
     def __saveCopy(self):
         """
@@ -3345,11 +3359,12 @@
         """
         self.__curFile = fileName
 
-        shownName = (
-            self.tr("Untitled")
-            if not self.__curFile
-            else self.__strippedName(self.__curFile)
-        )
+        if not self.__curFile:
+            shownName = self.tr("Untitled")
+        elif FileSystemUtilities.isDeviceFileName(self.__curFile):
+            shownName = self.__curFile
+        else:
+            shownName = self.__strippedName(self.__curFile)
 
         self.setWindowTitle(
             self.tr("{0}[*] - {1}").format(shownName, self.tr("Mini Editor"))
@@ -4361,7 +4376,7 @@
         """
         editorConfig = {}
 
-        if fileName:
+        if fileName and FileSystemUtilities.isPlainFileName(fileName):
             try:
                 editorConfig = editorconfig.get_properties(fileName)
             except editorconfig.EditorConfigError:
@@ -4535,3 +4550,47 @@
         """
         self.zoomTo(value)
         self.sbZoom.setValue(self.getZoom())
+
+    #######################################################################
+    ## Methods supporting MicroPython devices
+    #######################################################################
+
+    def __saveDeviceFile(self, saveas=False):
+        """
+        Private method to save the text to a file on the connected device.
+
+        @param saveas flag indicating a 'save as' action (defaults to False)
+        @type bool (optional)
+        @return flag indicating success
+        @rtype bool
+        """
+        with contextlib.suppress(KeyError):
+            mpy = ericApp().getObject("MicroPython")
+            filemanager = mpy.getFileManager()
+            if saveas:
+                fn, ok = QInputDialog.getText(
+                    self,
+                    self.tr("Save File to Device"),
+                    self.tr("Enter the complete device file path:"),
+                    QLineEdit.EchoMode.Normal,
+                    self.__curFile,
+                )
+                if not ok or not fn:
+                    # aborted
+                    return False
+            else:
+                fn = self.__curFile
+            # Convert the file name to device path separators ('/') and ensure,
+            # intermediate directories exist (creating them if necessary)
+            fn = fn.replace("\\", "/")
+            if "/" in fn:
+                dn = fn.rsplit("/", 1)[0]
+                filemanager.makedirs(FileSystemUtilities.plainFileName(dn))
+            success = filemanager.writeFile(
+                FileSystemUtilities.plainFileName(fn), self.text()
+            )
+            if success:
+                self.__setCurrentFile(fn)
+            return success
+
+        return False

eric ide

mercurial