--- a/eric6/MicroPython/MicroPythonFileManagerWidget.py Sat Aug 10 20:06:37 2019 +0200 +++ b/eric6/MicroPython/MicroPythonFileManagerWidget.py Mon Aug 12 14:53:07 2019 +0200 @@ -11,7 +11,6 @@ import os import shutil -import time from PyQt5.QtCore import pyqtSlot, Qt, QPoint from PyQt5.QtWidgets import ( @@ -116,9 +115,6 @@ self.__localMenu.addSeparator() self.__localDelFileAct = self.__localMenu.addAction( self.tr("Delete File"), self.__deleteLocalFile) - self.__localMenu.addSeparator() - self.__localMenu.addAction( - self.tr("Show Time"), self.__showLocalTime) self.__deviceMenu = QMenu(self) if not self.__repl.isMicrobit(): @@ -126,8 +122,9 @@ self.tr("Change Directory"), self.__changeDeviceDirectory) self.__deviceMenu.addAction( self.tr("Create Directory"), self.__createDeviceDirectory) - self.__devDelDirAct = self.__deviceMenu.addAction( - self.tr("Delete Directory"), self.__deleteDeviceDirectory) + if not self.__deviceWithLocalAccess: + self.__devDelDirAct = self.__deviceMenu.addAction( + self.tr("Delete Directory"), self.__deleteDeviceDirectory) self.__devDelDirTreeAct = self.__deviceMenu.addAction( self.tr("Delete Directory Tree"), self.__deleteDeviceDirectoryTree) @@ -298,7 +295,6 @@ dirname = self.localCwd.text() self.__listLocalFiles(dirname) - # TODO: @pyqtSlot(QTreeWidgetItem, int) def on_deviceFileTreeWidget_itemActivated(self, item, column): """ @@ -313,9 +309,16 @@ @type int """ name = os.path.join(self.deviceCwd.text(), item.text(0)) - if name.endswith("/"): - # directory names end with a '/' - self.__fileManager.cd(name[:-1]) + if self.__deviceWithLocalAccess: + if name.endswith("/"): + # directory names end with a '/' + self.__listLocalFiles(name[:-1], True) + elif Utilities.MimeTypes.isTextFile(name): + e5App().getObject("ViewManager").getEditor(name) + else: + if name.endswith("/"): + # directory names end with a '/' + self.__fileManager.cd(name[:-1]) @pyqtSlot() def on_deviceFileTreeWidget_itemSelectionChanged(self): @@ -330,7 +333,6 @@ self.getButton.setEnabled(enable) self.getAsButton.setEnabled(enable) - # TODO: @pyqtSlot() def on_deviceUpButton_clicked(self): """ @@ -338,19 +340,24 @@ """ cwd = self.deviceCwd.text() dirname = os.path.dirname(cwd) - self.__fileManager.cd(dirname) + if self.__deviceWithLocalAccess: + self.__listLocalFiles(dirname, True) + else: + self.__fileManager.cd(dirname) - # TODO: @pyqtSlot() def on_deviceReloadButton_clicked(self): """ Private slot to reload the device list. """ dirname = self.deviceCwd.text() - if dirname: - self.__fileManager.lls(dirname) + if self.__deviceWithLocalAccess: + self.__listLocalFiles(dirname, True) else: - self.__fileManager.pwd() + if dirname: + self.__fileManager.lls(dirname) + else: + self.__fileManager.pwd() def __isFileInList(self, filename, treeWidget): """ @@ -370,7 +377,6 @@ return False - # TODO: @pyqtSlot() def on_putButton_clicked(self, putAs=False): """ @@ -409,13 +415,21 @@ elif action == "rename": deviceFilename = os.path.basename(resultFilename) - deviceCwd = self.deviceCwd.text() - if deviceCwd: - deviceFilename = deviceCwd + "/" + deviceFilename - self.__fileManager.put( - os.path.join(self.localCwd.text(), filename), - deviceFilename - ) + if self.__deviceWithLocalAccess: + shutil.copy2( + os.path.join(self.localCwd.text(), filename), + os.path.join(self.deviceCwd.text(), deviceFilename) + ) + self.__listLocalFiles(self.deviceCwd.text(), + localDevice=True) + else: + deviceCwd = self.deviceCwd.text() + if deviceCwd and deviceCwd != "/": + deviceFilename = deviceCwd + "/" + deviceFilename + self.__fileManager.put( + os.path.join(self.localCwd.text(), filename), + deviceFilename + ) @pyqtSlot() def on_putAsButton_clicked(self): @@ -425,7 +439,6 @@ """ self.on_putButton_clicked(putAs=True) - # TODO: @pyqtSlot() def on_getButton_clicked(self, getAs=False): """ @@ -463,16 +476,20 @@ elif action == "rename": localFilename = resultFilename - deviceCwd = self.deviceCwd.text() - if deviceCwd: - filename = deviceCwd + "/" + filename - if not os.path.isabs(localFilename): - localFilename = os.path.join(self.localCwd.text(), - localFilename) - self.__fileManager.get( - filename, - localFilename - ) + if self.__deviceWithLocalAccess: + shutil.copy2( + os.path.join(self.deviceCwd.text(), filename), + os.path.join(self.localCwd.text(), localFilename) + ) + self.__listLocalFiles(self.localCwd.text()) + else: + deviceCwd = self.deviceCwd.text() + if deviceCwd: + filename = deviceCwd + "/" + filename + self.__fileManager.get( + filename, + os.path.join(self.localCwd.text(), localFilename) + ) @pyqtSlot() def on_getAsButton_clicked(self): @@ -494,7 +511,6 @@ """ self.__listLocalFiles(self.localCwd.text()) - # TODO: @pyqtSlot() def on_syncButton_clicked(self): """ @@ -503,7 +519,8 @@ self.__fileManager.rsync( self.localCwd.text(), self.deviceCwd.text(), - mirror=True + mirror=True, + localDevice=self.__deviceWithLocalAccess, ) @pyqtSlot(str, str) @@ -675,15 +692,24 @@ dirname, str(exc)) ) - # TODO: @pyqtSlot() - def __deleteLocalFile(self): + def __deleteLocalFile(self, localDevice=False): """ Private slot to delete a local file. + + @param localDevice flag indicating device access via local file system + @type bool """ - if bool(len(self.localFileTreeWidget.selectedItems())): - name = self.localFileTreeWidget.selectedItems()[0].text(0) - filename = os.path.join(self.localCwd.text(), name) + 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) dlg = DeleteFilesConfirmationDialog( self, self.tr("Delete File"), @@ -693,7 +719,8 @@ if dlg.exec_() == QDialog.Accepted: try: os.remove(filename) - self.__listLocalFiles(self.localCwd.text()) + self.__listLocalFiles(cwdWidget.text(), + localDevice=localDevice) except (OSError, IOError) as exc: E5MessageBox.critical( self, @@ -703,26 +730,6 @@ filename, str(exc)) ) - # TODO: move to repl widget super menu - @pyqtSlot() - def __showLocalTime(self): - """ - Private slot to show the local date and time. - """ - localdatetime = time.localtime() - loacldate = time.strftime('%Y-%m-%d', localdatetime) - localtime = time.strftime('%H:%M:%S', localdatetime) - E5MessageBox.information( - self, - self.tr("Local Date and Time"), - self.tr("<h3>Local Date and Time</h3>" - "<table>" - "<tr><td><b>Date</b></td><td>{0}</td></tr>" - "<tr><td><b>Time</b></td><td>{1}</td></tr>" - "</table>" - ).format(loacldate, localtime) - ) - ################################################################## ## Context menu methods for the device files below ################################################################## @@ -744,7 +751,8 @@ isDir = False isFile = False if not self.__repl.isMicrobit(): - self.__devDelDirAct.setEnabled(isDir) + if not self.__deviceWithLocalAccess: + self.__devDelDirAct.setEnabled(isDir) self.__devDelDirTreeAct.setEnabled(isDir) self.__devDelFileAct.setEnabled(isFile) @@ -798,7 +806,11 @@ else: if bool(len(self.deviceFileTreeWidget.selectedItems())): name = self.deviceFileTreeWidget.selectedItems()[0].text(0) - dirname = self.deviceCwd.text() + "/" + name[:-1] + cwd = self.deviceCwd.text() + if cwd and cwd != "/": + dirname = cwd + "/" + name[:-1] + else: + dirname = "/" + name[:-1] dlg = DeleteFilesConfirmationDialog( self, self.tr("Delete Directory"), @@ -819,7 +831,11 @@ else: if bool(len(self.deviceFileTreeWidget.selectedItems())): name = self.deviceFileTreeWidget.selectedItems()[0].text(0) - dirname = self.deviceCwd.text() + "/" + name[:-1] + cwd = self.deviceCwd.text() + if cwd and cwd != "/": + dirname = cwd + "/" + name[:-1] + else: + dirname = "/" + name[:-1] dlg = DeleteFilesConfirmationDialog( self, self.tr("Delete Directory Tree"), @@ -829,27 +845,29 @@ if dlg.exec_() == QDialog.Accepted: self.__fileManager.rmdir(dirname, recursive=True) - # TODO: @pyqtSlot() def __deleteDeviceFile(self): """ Private slot to delete a file. """ - if bool(len(self.deviceFileTreeWidget.selectedItems())): - name = self.deviceFileTreeWidget.selectedItems()[0].text(0) - dirname = self.deviceCwd.text() - if dirname: - filename = dirname + "/" + name - else: - filename = name - dlg = DeleteFilesConfirmationDialog( - self, - self.tr("Delete File"), - self.tr( - "Do you really want to delete this file?"), - [filename]) - if dlg.exec_() == QDialog.Accepted: - self.__fileManager.delete(filename) + if self.__deviceWithLocalAccess: + self.__deleteLocalFile(True) + else: + if bool(len(self.deviceFileTreeWidget.selectedItems())): + name = self.deviceFileTreeWidget.selectedItems()[0].text(0) + dirname = self.deviceCwd.text() + if dirname and dirname != "/": + filename = dirname + "/" + name + else: + filename = "/" + name + dlg = DeleteFilesConfirmationDialog( + self, + self.tr("Delete File"), + self.tr( + "Do you really want to delete this file?"), + [filename]) + if dlg.exec_() == QDialog.Accepted: + self.__fileManager.delete(filename) @pyqtSlot() def __showFileSystemInfo(self):