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