eric6/UI/FindFileDialog.py

branch
maintenance
changeset 8043
0acf98cd089a
parent 7924
8a96736d465e
parent 7992
0d1e35a10a0b
child 8176
31965986ecd1
diff -r 866adc8c315b -r 0acf98cd089a eric6/UI/FindFileDialog.py
--- a/eric6/UI/FindFileDialog.py	Sun Jan 17 13:53:08 2021 +0100
+++ b/eric6/UI/FindFileDialog.py	Mon Feb 01 10:38:16 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(), "")
@@ -144,7 +149,7 @@
         @param start start position of match (integer)
         @param end end position of match (integer)
         @param replTxt text with replacements applied (string)
-        @keyparam md5 MD5 hash of the file (string)
+        @param md5 MD5 hash of the file (string)
         """
         if self.__lastFileItem is None:
             # It's a new file
@@ -155,9 +160,6 @@
                 self.__lastFileItem.setFlags(
                     self.__lastFileItem.flags() |
                     Qt.ItemFlags(Qt.ItemIsUserCheckable | Qt.ItemIsTristate))
-                # Qt bug:
-                # item is not user checkable if setFirstColumnSpanned
-                # is True (< 4.5.0)
             self.__lastFileItem.setData(0, self.md5Role, md5)
         
         itm = QTreeWidgetItem(self.__lastFileItem)
@@ -326,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():
@@ -345,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()
@@ -411,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()
@@ -564,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