eric6/UI/FindFileDialog.py

changeset 7992
0d1e35a10a0b
parent 7945
76daafe10009
child 8043
0acf98cd089a
child 8143
2c730d5fd177
--- a/eric6/UI/FindFileDialog.py	Sun Jan 17 12:40:19 2021 +0100
+++ b/eric6/UI/FindFileDialog.py	Sun Jan 17 16:21:57 2021 +0100
@@ -101,6 +101,11 @@
         self.replacetextCombo.addItems(self.replaceHistory)
         self.dirPicker.addItems(self.dirHistory)
         
+        self.excludeHiddenCheckBox.setChecked(Preferences.toBool(
+            Preferences.Prefs.settings.value(
+                "FindFileDialog/ExcludeHidden", True)
+        ))
+        
         self.project = project
         
         self.findList.headerItem().setText(self.findList.columnCount(), "")
@@ -323,10 +328,16 @@
         
         if self.projectButton.isChecked():
             if self.filterCheckBox.isChecked():
-                files = [self.project.getRelativePath(file)
-                         for file in
-                         self.__getFileList(
-                             self.project.getProjectPath(), filterRe)]
+                files = [
+                    self.project.getRelativePath(file)
+                    for file in
+                    self.__getFileList(
+                        self.project.getProjectPath(),
+                        filterRe,
+                        excludeHiddenDirs=self.excludeHiddenCheckBox
+                        .isChecked(),
+                    )
+                ]
             else:
                 files = []
                 if self.sourcesCheckBox.isChecked():
@@ -342,27 +353,73 @@
         elif self.dirButton.isChecked():
             if not self.filterCheckBox.isChecked():
                 filters = []
-                if self.sourcesCheckBox.isChecked():
-                    filters.extend(
-                        ["^{0}$".format(
-                            assoc.replace(".", r"\.").replace("*", ".*"))
-                         for assoc in list(
-                             Preferences.getEditorLexerAssocs().keys())
-                         if assoc not in self.formsExt + self.interfacesExt +
-                            self.protocolsExt])
-                if self.formsCheckBox.isChecked():
-                    filters.append(self.filterForms)
-                if self.interfacesCheckBox.isChecked():
-                    filters.append(self.filterInterfaces)
-                if self.protocolsCheckBox.isChecked():
-                    filters.append(self.filterProtocols)
-                if self.resourcesCheckBox.isChecked():
-                    filters.append(self.filterResources)
+                if (
+                    self.project.isOpen() and
+                    os.path.abspath(self.dirPicker.currentText()).startswith(
+                        self.project.getProjectPath())
+                ):
+                    if self.sourcesCheckBox.isChecked():
+                        filters.extend([
+                            "^{0}$".format(
+                                assoc.replace(".", r"\.").replace("*", ".*")
+                            ) for assoc in
+                            self.project.getFiletypeAssociations("SOURCES")
+                        ])
+                    if self.formsCheckBox.isChecked():
+                        filters.extend([
+                            "^{0}$".format(
+                                assoc.replace(".", r"\.").replace("*", ".*")
+                            ) for assoc in
+                            self.project.getFiletypeAssociations("FORMS")
+                        ])
+                    if self.interfacesCheckBox.isChecked():
+                        filters.extend([
+                            "^{0}$".format(
+                                assoc.replace(".", r"\.").replace("*", ".*")
+                            ) for assoc in
+                            self.project.getFiletypeAssociations("INTERFACES")
+                        ])
+                    if self.protocolsCheckBox.isChecked():
+                        filters.extend([
+                            "^{0}$".format(
+                                assoc.replace(".", r"\.").replace("*", ".*")
+                            ) for assoc in
+                            self.project.getFiletypeAssociations("PROTOCOLS")
+                        ])
+                    if self.resourcesCheckBox.isChecked():
+                        filters.extend([
+                            "^{0}$".format(
+                                assoc.replace(".", r"\.").replace("*", ".*")
+                            ) for assoc in
+                            self.project.getFiletypeAssociations("RESOURCES")
+                        ])
+                else:
+                    if self.sourcesCheckBox.isChecked():
+                        filters.extend([
+                            "^{0}$".format(
+                                assoc.replace(".", r"\.").replace("*", ".*"))
+                            for assoc in list(
+                                Preferences.getEditorLexerAssocs().keys())
+                            if assoc not in
+                            self.formsExt + self.interfacesExt +
+                            self.protocolsExt + self.resourcesExt
+                        ])
+                    if self.formsCheckBox.isChecked():
+                        filters.append(self.filterForms)
+                    if self.interfacesCheckBox.isChecked():
+                        filters.append(self.filterInterfaces)
+                    if self.protocolsCheckBox.isChecked():
+                        filters.append(self.filterProtocols)
+                    if self.resourcesCheckBox.isChecked():
+                        filters.append(self.filterResources)
                 filterString = "|".join(filters)
                 filterRe = re.compile(filterString)
             files = self.__getFileList(
                 os.path.abspath(self.dirPicker.currentText()),
-                filterRe)
+                filterRe,
+                excludeHiddenDirs=self.excludeHiddenCheckBox.isChecked(),
+                excludeHiddenFiles=self.excludeHiddenCheckBox.isChecked(),
+            )
         elif self.openFilesButton.isChecked():
             vm = e5App().getObject("ViewManager")
             vm.checkAllDirty()
@@ -408,6 +465,9 @@
         Preferences.Prefs.settings.setValue(
             "FindFileDialog/SearchHistory",
             self.searchHistory[:30])
+        Preferences.Prefs.settings.setValue(
+            "FindFileDialog/ExcludeHidden",
+            self.excludeHiddenCheckBox.isChecked())
         
         if self.__replaceMode:
             replTxt = self.replacetextCombo.currentText()
@@ -561,22 +621,35 @@
         else:
             self.sourceFile.emit(fn, line, "", start, end)
         
-    def __getFileList(self, path, filterRe):
+    def __getFileList(self, path, filterRe, excludeHiddenDirs=False,
+                      excludeHiddenFiles=False):
         """
         Private method to get a list of files to search.
         
-        @param path the root directory to search in (string)
+        @param path the root directory to search in
+        @type str
         @param filterRe regular expression defining the filter
-            criteria (regexp object)
-        @return list of files to be processed (list of strings)
+            criteria
+        @type regexp object
+        @param excludeHiddenDirs flag indicating to exclude hidden directories
+        @type bool
+        @param excludeHiddenFiles flag indicating to exclude hidden files
+        @type bool
+        @return list of files to be processed
+        @rtype list of str
         """
         path = os.path.abspath(path)
         files = []
-        for dirname, _, names in os.walk(path):
-            files.extend([os.path.join(dirname, f)
-                          for f in names
-                          if re.match(filterRe, f)]
-                         )
+        for dirname, dirs, filenames in os.walk(path):
+            files.extend([
+                os.path.join(dirname, f) for f in filenames
+                if (not (excludeHiddenFiles and f.startswith(".")) and
+                    re.match(filterRe, f))
+            ])
+            if excludeHiddenDirs:
+                for d in dirs[:]:
+                    if d .startswith("."):
+                        dirs.remove(d)
         return files
         
     def setSearchDirectory(self, searchDir):

eric ide

mercurial