MicroPythonFileManagerWidget: added option to show hidden files to the local and device files list context menu. micropython

Tue, 13 Aug 2019 17:52:58 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Tue, 13 Aug 2019 17:52:58 +0200
branch
micropython
changeset 7137
4ed2573947ff
parent 7136
bddcb634a9b8
child 7138
a2a53535d855

MicroPythonFileManagerWidget: added option to show hidden files to the local and device files list context menu.

eric6/MicroPython/MicroPythonCommandsInterface.py file | annotate | diff | comparison | revisions
eric6/MicroPython/MicroPythonFileManager.py file | annotate | diff | comparison | revisions
eric6/MicroPython/MicroPythonFileManagerWidget.py file | annotate | diff | comparison | revisions
eric6/MicroPython/MicroPythonFileSystemUtilities.py file | annotate | diff | comparison | revisions
eric6/Preferences/__init__.py file | annotate | diff | comparison | revisions
--- 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]))

eric ide

mercurial