--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/eric7/UI/FindFileFiltersEditDialog.py Wed Jan 10 09:42:15 2024 +0100 @@ -0,0 +1,180 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2023 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a dialog to configure the file filters. +""" + +from PyQt6.QtCore import Qt, pyqtSlot +from PyQt6.QtWidgets import QDialog, QTreeWidgetItem + +from eric7 import Preferences +from eric7.EricWidgets import EricMessageBox +from eric7.QScintilla import Lexers + +from .FindFileFilterPropertiesDialog import FindFileFilterPropertiesDialog +from .Ui_FindFileFiltersEditDialog import Ui_FindFileFiltersEditDialog + + +class FindFileFiltersEditDialog(QDialog, Ui_FindFileFiltersEditDialog): + """ + Class implementing a dialog to configure the file filters. + """ + + FilterTextRole = Qt.ItemDataRole.UserRole + FilterPatternRole = Qt.ItemDataRole.UserRole + 1 + + def __init__(self, filters, parent=None): + """ + Constructor + + @param filters dictionary containing the existing file filters + @type dict + @param parent reference to the parent widget (defaults to None) + @type QWidget (optional) + """ + super().__init__(parent) + self.setupUi(self) + + self.fileFiltersList.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder) + self.__populateFilters(filters) + + def __populateFilters(self, filters): + """ + Private method to populate the filters list. + + @param filters dictionary containing the existing file filters + @type dict + """ + self.fileFiltersList.clear() + + for name in sorted(filters): + QTreeWidgetItem(self.fileFiltersList, [name, filters[name]]) + + self.__adjustColumns() + + def __adjustColumns(self): + """ + Private method to adjust the column widths. + """ + self.fileFiltersList.resizeColumnToContents(0) + self.fileFiltersList.resizeColumnToContents(1) + + @pyqtSlot() + def on_fileFiltersList_itemSelectionChanged(self): + """ + Private slot to handle a change of the selected items. + """ + selectedItemsLength = len(self.fileFiltersList.selectedItems()) + self.editFileFilterButton.setEnabled(selectedItemsLength == 1) + self.deleteFileFilterButton.setEnabled(selectedItemsLength > 0) + + @pyqtSlot() + def on_addFileFilterButton_clicked(self): + """ + Private slot to add a new filter entry. + """ + filters = self.__getFiltersList() + dlg = FindFileFilterPropertiesDialog(filters, parent=self) + if dlg.exec() == QDialog.DialogCode.Accepted: + name, pattern = dlg.getProperties() + QTreeWidgetItem(self.fileFiltersList, [name, pattern]) + self.__adjustColumns() + + @pyqtSlot() + def on_editFileFilterButton_clicked(self): + """ + Private slot to edit the selected filter entry.. + """ + filters = self.__getFiltersList(forEdit=True) + selectedEntry = self.fileFiltersList.selectedItems()[0] + dlg = FindFileFilterPropertiesDialog( + filters, properties=(selectedEntry.text(0), selectedEntry.text(1)) + ) + if dlg.exec() == QDialog.DialogCode.Accepted: + name, pattern = dlg.getProperties() + selectedEntry.setText(0, name) + selectedEntry.setText(1, pattern) + + @pyqtSlot() + def on_deleteFileFilterButton_clicked(self): + """ + Private slot to delete the selected filter entries. + """ + yes = EricMessageBox.yesNo( + self, + self.tr("Delete Selected Filters"), + self.tr("""Shall the selected filters really be deleted?"""), + ) + if yes: + for itm in self.fileFiltersList.selectedItems(): + self.fileFiltersList.takeTopLevelItem( + self.fileFiltersList.indexOfTopLevelItem(itm) + ) + del itm + + @pyqtSlot() + def on_defaultFiltersButton_clicked(self): + """ + Private slot to create the default list of file filters. + """ + if self.fileFiltersList.topLevelItemCount(): + ok = EricMessageBox.yesNo( + self, + self.tr("Default Filters"), + self.tr( + "Do you really want to clear the list of defined file filters and" + " replace it with the list of default filters?" + ), + ) + if not ok: + return + + openFileFiltersList = ( + Lexers.getOpenFileFiltersList(False, withAdditional=False) + + Preferences.getEditor("AdditionalOpenFilters")[:] + ) + + filters = {} + for openFileFilter in openFileFiltersList: + name, pattern = openFileFilter.split(" (", 1) + pattern = ";".join(pattern.strip().rstrip(")").split()) + filters[name.strip()] = pattern + + self.__populateFilters(filters) + + def __getFiltersList(self, forEdit=False): + """ + Private method to get the list of defined filter names. + + @param forEdit flag indicating a list for an edit operation + (defaults to False) + @type bool (optional) + @return list of defined filter names + @rtype list of str + """ + selectedItems = self.fileFiltersList.selectedItems() if forEdit else [] + + filters = [] + for row in range(self.fileFiltersList.topLevelItemCount()): + itm = self.fileFiltersList.topLevelItem(row) + if itm not in selectedItems: + filters.append(itm.text(0)) + + return filters + + def getFilters(self): + """ + Public method to retrieve the edited filter list. + + @return dictionary containing the defined file filters + @rtype dict + """ + filters = {} + for row in range(self.fileFiltersList.topLevelItemCount()): + itm = self.fileFiltersList.topLevelItem(row) + filters[itm.text(0)] = itm.text(1) + + return filters