--- 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):