src/eric7/UI/FindFileFiltersEditDialog.py

Wed, 10 Jan 2024 09:42:15 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Wed, 10 Jan 2024 09:42:15 +0100
branch
eric7
changeset 10492
53eac4c7d10b
child 10494
8db0328580d7
permissions
-rw-r--r--

Find In Files
- Changed the filter entry to a filter selector with associated edit capability to define a list of filter entries.

# -*- 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

eric ide

mercurial