--- a/src/eric7/MicroPython/MicroPythonFileManagerWidget.py Fri Jan 19 09:50:47 2024 +0100 +++ b/src/eric7/MicroPython/MicroPythonFileManagerWidget.py Sat Jan 20 12:36:40 2024 +0100 @@ -131,6 +131,10 @@ self.tr("Delete Directory Tree"), self.__deleteLocalDirectoryTree ) self.__localMenu.addSeparator() + self.__localRenameFileAct = self.__localMenu.addAction( + self.tr("Rename File"), self.__renameLocalFile + ) + self.__localMenu.addSeparator() self.__localDelFileAct = self.__localMenu.addAction( self.tr("Delete File"), self.__deleteLocalFile ) @@ -155,6 +159,10 @@ self.tr("Delete Directory Tree"), self.__deleteDeviceDirectoryTree ) self.__deviceMenu.addSeparator() + self.__devRenameFileAct = self.__deviceMenu.addAction( + self.tr("Rename File"), self.__renameDeviceFile + ) + self.__deviceMenu.addSeparator() self.__devDelFileAct = self.__deviceMenu.addAction( self.tr("Delete File"), self.__deleteDeviceFile ) @@ -842,6 +850,7 @@ isDir = False isFile = False self.__localDelDirTreeAct.setEnabled(isDir) + self.__localRenameFileAct.setEnabled(isFile) self.__localDelFileAct.setEnabled(isFile) self.__localMenu.exec(self.localFileTreeWidget.mapToGlobal(pos)) @@ -977,6 +986,51 @@ ).format(filename, str(exc)), ) + @pyqtSlot() + def __renameLocalFile(self, localDevice=False): + """ + Private slot to rename a file on the device. + + @param localDevice flag indicating device access via local file system + (defaults to False) + @type bool (optional) + """ + if localDevice: + cwdWidget = self.deviceCwd + fileTreeWidget = self.deviceFileTreeWidget + else: + cwdWidget = self.localCwd + fileTreeWidget = self.localFileTreeWidget + + if bool(len(fileTreeWidget.selectedItems())): + name = fileTreeWidget.selectedItems()[0].text(0) + filename = os.path.join(cwdWidget.text(), name) + newname, ok = QInputDialog.getText( + self, + self.tr("Rename File"), + self.tr("Enter the new path for the file"), + QLineEdit.EchoMode.Normal, + filename, + ) + if ok and newname: + try: + os.rename(filename, newname) + except OSError as exc: + EricMessageBox.critical( + self, + self.tr("Rename File"), + self.tr( + """<p>The file <b>{0}</b> could not be""" + """ renamed to <b>{1}</b>.</p><p>Reason: {2}</p>""" + ).format(filename, newname, str(exc)), + ) + + # reload the directory listing + if localDevice: + self.on_deviceReloadButton_clicked() + else: + self.on_localReloadButton_clicked() + @pyqtSlot(bool) def __localHiddenChanged(self, checked): """ @@ -1011,6 +1065,7 @@ if not self.__repl.isMicrobit(): self.__devDelDirAct.setEnabled(isDir) self.__devDelDirTreeAct.setEnabled(isDir) + self.__devRenameFileAct.setEnabled(isFile) self.__devDelFileAct.setEnabled(isFile) self.__deviceMenu.exec(self.deviceFileTreeWidget.mapToGlobal(pos)) @@ -1137,6 +1192,36 @@ if dlg.exec() == QDialog.DialogCode.Accepted: self.__fileManager.delete(filename) + @pyqtSlot() + def __renameDeviceFile(self): + """ + Private slot to rename a file on the device. + """ + if self.__repl.deviceSupportsLocalFileAccess(): + self.__renameLocalFile(True) + else: + if bool(len(self.deviceFileTreeWidget.selectedItems())): + name = self.deviceFileTreeWidget.selectedItems()[0].text(0) + dirname = self.deviceCwd.text() + if dirname: + if dirname != "/": + filename = dirname + "/" + name + else: + filename = "/" + name + else: + filename = name + newname, ok = QInputDialog.getText( + self, + self.tr("Rename File"), + self.tr("Enter the new path for the file"), + QLineEdit.EchoMode.Normal, + filename, + ) + if ok and newname: + success = self.__fileManager.rename(filename, newname) + if success: + self.on_deviceReloadButton_clicked() + @pyqtSlot(bool) def __deviceHiddenChanged(self, checked): """