Tue, 13 Aug 2019 17:52:58 +0200
MicroPythonFileManagerWidget: added option to show hidden files to the local and device files list context menu.
--- a/eric6/MicroPython/MicroPythonCommandsInterface.py Tue Aug 13 16:39:31 2019 +0200 +++ b/eric6/MicroPython/MicroPythonCommandsInterface.py Tue Aug 13 17:52:58 2019 +0200 @@ -311,7 +311,7 @@ raise IOError(self.__shortError(err)) return ast.literal_eval(out.decode("utf-8")) - def lls(self, dirname="", fullstat=False): + def lls(self, dirname="", fullstat=False, showHidden=False): """ Public method to get a long directory listing of the connected device including meta data. @@ -320,6 +320,8 @@ @type str @param fullstat flag indicating to return the full stat() tuple @type bool + @param showHidden flag indicating to show hidden files as well + @type bool @return list containing the directory listing with tuple entries of the name and and a tuple of mode, size and time (if fullstat is false) or the complete stat() tuple. 'None' is returned in case the @@ -332,8 +334,9 @@ commands = [ "import os as __os_", "\n".join([ - "def is_visible(filename):", - " return filename[0] != '.' and filename[-1] != '~'", + "def is_visible(filename, showHidden):", + " return showHidden or " + "(filename[0] != '.' and filename[-1] != '~')", ]), "\n".join([ "def stat(filename):", @@ -341,20 +344,21 @@ " return (0, 0, 0, 0, 0, 0, size, 0, 0, 0)" ]), "\n".join([ - "def listdir_stat():", + "def listdir_stat(showHidden):", " files = __os_.listdir()", " return list((f, stat(f)) for f in files if" - " is_visible(f))", + " is_visible(f,showHidden))", ]), - "print(listdir_stat())", + "print(listdir_stat({0}))".format(showHidden), "del __os_, stat, listdir_stat, is_visible", ] else: commands = [ "import os as __os_", "\n".join([ - "def is_visible(filename):", - " return filename[0] != '.' and filename[-1] != '~'", + "def is_visible(filename, showHidden):", + " return showHidden or " + "(filename[0] != '.' and filename[-1] != '~')", ]), "\n".join([ "def stat(filename):", @@ -365,18 +369,18 @@ " return tuple(rstat)", ]), "\n".join([ - "def listdir_stat(dirname):", + "def listdir_stat(dirname, showHidden):", " try:", " files = __os_.listdir(dirname)", " except OSError:", " return None", " if dirname in ('', '/'):", " return list((f, stat(f)) for f in files if" - " is_visible(f))", + " is_visible(f, showHidden))", " return list((f, stat(dirname + '/' + f))" - " for f in files if is_visible(f))", + " for f in files if is_visible(f, showHidden))", ]), - "print(listdir_stat('{0}'))".format(dirname), + "print(listdir_stat('{0}', {1}))".format(dirname, showHidden), "del __os_, stat, listdir_stat, is_visible", ] out, err = self.execute(commands)
--- a/eric6/MicroPython/MicroPythonFileManager.py Tue Aug 13 16:39:31 2019 +0200 +++ b/eric6/MicroPython/MicroPythonFileManager.py Tue Aug 13 17:52:58 2019 +0200 @@ -77,15 +77,18 @@ self.__commandsInterface = commandsInterface @pyqtSlot(str) - def lls(self, dirname): + def lls(self, dirname, showHidden=False): """ Public slot to get a long listing of the given directory. @param dirname name of the directory to list @type str + @param showHidden flag indicating to show hidden files as well + @type bool """ try: - filesList = self.__commandsInterface.lls(dirname) + filesList = self.__commandsInterface.lls( + dirname, showHidden=showHidden) result = [(decoratedName(name, mode), mode2string(mode), str(size),
--- a/eric6/MicroPython/MicroPythonFileManagerWidget.py Tue Aug 13 16:39:31 2019 +0200 +++ b/eric6/MicroPython/MicroPythonFileManagerWidget.py Tue Aug 13 17:52:58 2019 +0200 @@ -105,7 +105,6 @@ self.deviceFileTreeWidget.customContextMenuRequested.connect( self.__showDeviceContextMenu) - # TODO: add entry to show hidden files self.__localMenu = QMenu(self) self.__localMenu.addAction(self.tr("Change Directory"), self.__changeLocalDirectory) @@ -116,8 +115,12 @@ self.__localMenu.addSeparator() self.__localDelFileAct = self.__localMenu.addAction( self.tr("Delete File"), self.__deleteLocalFile) + self.__localMenu.addSeparator() + act = self.__localMenu.addAction(self.tr("Show Hidden Files")) + act.setCheckable(True) + act.setChecked(Preferences.getMicroPython("ShowHiddenLocal")) + act.triggered[bool].connect(self.__localHiddenChanged) - # TODO: add entry to show hidden files self.__deviceMenu = QMenu(self) if not self.__repl.isMicrobit(): self.__deviceMenu.addAction( @@ -133,6 +136,11 @@ self.__deviceMenu.addSeparator() self.__devDelFileAct = self.__deviceMenu.addAction( self.tr("Delete File"), self.__deleteDeviceFile) + self.__deviceMenu.addSeparator() + act = self.__deviceMenu.addAction(self.tr("Show Hidden Files")) + act.setCheckable(True) + act.setChecked(Preferences.getMicroPython("ShowHiddenDevice")) + act.triggered[bool].connect(self.__deviceHiddenChanged) if not parent.isMicrobit(): self.__deviceMenu.addSeparator() self.__deviceMenu.addAction( @@ -191,7 +199,7 @@ @type str """ self.deviceCwd.setText(dirname) - self.__fileManager.lls(dirname) + self.__newDeviceList() @pyqtSlot(tuple) def __handleLongListFiles(self, filesList): @@ -226,10 +234,12 @@ dirname = dirname[:-1] if localDevice: self.deviceCwd.setText(dirname) + showHidden = Preferences.getMicroPython("ShowHiddenDevice") else: self.localCwd.setText(dirname) + showHidden = Preferences.getMicroPython("ShowHiddenLocal") - filesStatList = listdirStat(dirname) + filesStatList = listdirStat(dirname, showHidden=showHidden) filesList = [( decoratedName(f, s[0], os.path.isdir(os.path.join(dirname, f))), mode2string(s[0]), @@ -357,7 +367,7 @@ self.__listLocalFiles(dirname, True) else: if dirname: - self.__fileManager.lls(dirname) + self.__newDeviceList() else: self.__fileManager.pwd() @@ -426,8 +436,11 @@ localDevice=True) else: deviceCwd = self.deviceCwd.text() - if deviceCwd and deviceCwd != "/": - deviceFilename = deviceCwd + "/" + deviceFilename + if deviceCwd: + if deviceCwd != "/": + deviceFilename = deviceCwd + "/" + deviceFilename + else: + deviceFilename = "/" + deviceFilename self.__fileManager.put( os.path.join(self.localCwd.text(), filename), deviceFilename @@ -536,7 +549,7 @@ @type str """ self.__listLocalFiles(self.localCwd.text()) - self.__fileManager.lls(self.deviceCwd.text()) + self.__newDeviceList() @pyqtSlot(str) def __handleRsyncProgressMessage(self, message): @@ -569,7 +582,10 @@ """ Private slot to initiate a new long list of the device directory. """ - self.__fileManager.lls(self.deviceCwd.text()) + self.__fileManager.lls( + self.deviceCwd.text(), + showHidden=Preferences.getMicroPython("ShowHiddenDevice") + ) ################################################################## ## Context menu methods for the local files below @@ -732,6 +748,17 @@ filename, str(exc)) ) + @pyqtSlot(bool) + def __localHiddenChanged(self, checked): + """ + Private slot handling a change of the local show hidden menu entry. + + @param checked new check state of the action + @type bool + """ + Preferences.setMicroPython("ShowHiddenLocal", checked) + self.on_localReloadButton_clicked() + ################################################################## ## Context menu methods for the device files below ################################################################## @@ -809,10 +836,13 @@ if bool(len(self.deviceFileTreeWidget.selectedItems())): name = self.deviceFileTreeWidget.selectedItems()[0].text(0) cwd = self.deviceCwd.text() - if cwd and cwd != "/": - dirname = cwd + "/" + name[:-1] + if cwd: + if cwd != "/": + dirname = cwd + "/" + name[:-1] + else: + dirname = "/" + name[:-1] else: - dirname = "/" + name[:-1] + dirname = name[:-1] dlg = DeleteFilesConfirmationDialog( self, self.tr("Delete Directory"), @@ -834,10 +864,13 @@ if bool(len(self.deviceFileTreeWidget.selectedItems())): name = self.deviceFileTreeWidget.selectedItems()[0].text(0) cwd = self.deviceCwd.text() - if cwd and cwd != "/": - dirname = cwd + "/" + name[:-1] + if cwd: + if cwd != "/": + dirname = cwd + "/" + name[:-1] + else: + dirname = "/" + name[:-1] else: - dirname = "/" + name[:-1] + dirname = name[:-1] dlg = DeleteFilesConfirmationDialog( self, self.tr("Delete Directory Tree"), @@ -858,10 +891,13 @@ if bool(len(self.deviceFileTreeWidget.selectedItems())): name = self.deviceFileTreeWidget.selectedItems()[0].text(0) dirname = self.deviceCwd.text() - if dirname and dirname != "/": - filename = dirname + "/" + name + if dirname: + if dirname != "/": + filename = dirname + "/" + name + else: + filename = "/" + name else: - filename = "/" + name + filename = name dlg = DeleteFilesConfirmationDialog( self, self.tr("Delete File"), @@ -871,6 +907,17 @@ if dlg.exec_() == QDialog.Accepted: self.__fileManager.delete(filename) + @pyqtSlot(bool) + def __deviceHiddenChanged(self, checked): + """ + Private slot handling a change of the device show hidden menu entry. + + @param checked new check state of the action + @type bool + """ + Preferences.setMicroPython("ShowHiddenDevice", checked) + self.on_deviceReloadButton_clicked() + @pyqtSlot() def __showFileSystemInfo(self): """
--- a/eric6/MicroPython/MicroPythonFileSystemUtilities.py Tue Aug 13 16:39:31 2019 +0200 +++ b/eric6/MicroPython/MicroPythonFileSystemUtilities.py Tue Aug 13 17:52:58 2019 +0200 @@ -62,16 +62,21 @@ return name -def isVisible(name): +def isVisible(name, showHidden): """ Function to check, if a filesystem entry is a hidden file or directory. @param name name to be checked @type str + @param showHidden flag indicating to show hidden files as well + @type bool @return flag indicating a visible filesystem entry @rtype bool """ - return not name.startswith(".") and not name.endswith("~") + return ( + showHidden or + (not name.startswith(".") and not name.endswith("~")) + ) def fstat(filename): @@ -90,12 +95,14 @@ return tuple(rstat) -def listdirStat(dirname): +def listdirStat(dirname, showHidden=False): """ Function to get a list of directory entries and associated stat() tuples. @param dirname name of the directory to list @type str + @param showHidden flag indicating to show hidden files as well + @type bool @return list of tuples containing the entry name and the associated stat() tuple @rtype list of tuple of (str, tuple) @@ -109,7 +116,7 @@ return [] if dirname in ('', '/'): - return [(f, fstat(f)) for f in files if isVisible(f)] + return [(f, fstat(f)) for f in files if isVisible(f, showHidden)] return [(f, fstat(os.path.join(dirname, f))) for f in files - if isVisible(f)] + if isVisible(f, showHidden)]
--- a/eric6/Preferences/__init__.py Tue Aug 13 16:39:31 2019 +0200 +++ b/eric6/Preferences/__init__.py Tue Aug 13 17:52:58 2019 +0200 @@ -1595,6 +1595,8 @@ "SerialTimeout": 2000, # timeout in milliseconds "ReplLineWrap": True, # wrap the REPL lines "SyncTimeAfterConnect": True, + "ShowHiddenLocal": True, + "ShowHiddenDevice": True, } if Globals.isWindowsPlatform(): microPythonDefaults["ColorScheme"] = "Windows 10" @@ -3828,7 +3830,8 @@ return int(prefClass.settings.value( "MicroPython/" + key, prefClass.microPythonDefaults[key])) - elif key in ["ReplLineWrap"]: + elif key in ["ReplLineWrap", "SyncTimeAfterConnect", "ShowHiddenLocal", + "ShowHiddenDevice",]: return toBool(prefClass.settings.value( "MicroPython/" + key, prefClass.microPythonDefaults[key]))