src/eric7/UI/FindFileFiltersEditDialog.py

branch
eric7
changeset 10492
53eac4c7d10b
child 10494
8db0328580d7
equal deleted inserted replaced
10491:acabc60b19a2 10492:53eac4c7d10b
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2023 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a dialog to configure the file filters.
8 """
9
10 from PyQt6.QtCore import Qt, pyqtSlot
11 from PyQt6.QtWidgets import QDialog, QTreeWidgetItem
12
13 from eric7 import Preferences
14 from eric7.EricWidgets import EricMessageBox
15 from eric7.QScintilla import Lexers
16
17 from .FindFileFilterPropertiesDialog import FindFileFilterPropertiesDialog
18 from .Ui_FindFileFiltersEditDialog import Ui_FindFileFiltersEditDialog
19
20
21 class FindFileFiltersEditDialog(QDialog, Ui_FindFileFiltersEditDialog):
22 """
23 Class implementing a dialog to configure the file filters.
24 """
25
26 FilterTextRole = Qt.ItemDataRole.UserRole
27 FilterPatternRole = Qt.ItemDataRole.UserRole + 1
28
29 def __init__(self, filters, parent=None):
30 """
31 Constructor
32
33 @param filters dictionary containing the existing file filters
34 @type dict
35 @param parent reference to the parent widget (defaults to None)
36 @type QWidget (optional)
37 """
38 super().__init__(parent)
39 self.setupUi(self)
40
41 self.fileFiltersList.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
42 self.__populateFilters(filters)
43
44 def __populateFilters(self, filters):
45 """
46 Private method to populate the filters list.
47
48 @param filters dictionary containing the existing file filters
49 @type dict
50 """
51 self.fileFiltersList.clear()
52
53 for name in sorted(filters):
54 QTreeWidgetItem(self.fileFiltersList, [name, filters[name]])
55
56 self.__adjustColumns()
57
58 def __adjustColumns(self):
59 """
60 Private method to adjust the column widths.
61 """
62 self.fileFiltersList.resizeColumnToContents(0)
63 self.fileFiltersList.resizeColumnToContents(1)
64
65 @pyqtSlot()
66 def on_fileFiltersList_itemSelectionChanged(self):
67 """
68 Private slot to handle a change of the selected items.
69 """
70 selectedItemsLength = len(self.fileFiltersList.selectedItems())
71 self.editFileFilterButton.setEnabled(selectedItemsLength == 1)
72 self.deleteFileFilterButton.setEnabled(selectedItemsLength > 0)
73
74 @pyqtSlot()
75 def on_addFileFilterButton_clicked(self):
76 """
77 Private slot to add a new filter entry.
78 """
79 filters = self.__getFiltersList()
80 dlg = FindFileFilterPropertiesDialog(filters, parent=self)
81 if dlg.exec() == QDialog.DialogCode.Accepted:
82 name, pattern = dlg.getProperties()
83 QTreeWidgetItem(self.fileFiltersList, [name, pattern])
84 self.__adjustColumns()
85
86 @pyqtSlot()
87 def on_editFileFilterButton_clicked(self):
88 """
89 Private slot to edit the selected filter entry..
90 """
91 filters = self.__getFiltersList(forEdit=True)
92 selectedEntry = self.fileFiltersList.selectedItems()[0]
93 dlg = FindFileFilterPropertiesDialog(
94 filters, properties=(selectedEntry.text(0), selectedEntry.text(1))
95 )
96 if dlg.exec() == QDialog.DialogCode.Accepted:
97 name, pattern = dlg.getProperties()
98 selectedEntry.setText(0, name)
99 selectedEntry.setText(1, pattern)
100
101 @pyqtSlot()
102 def on_deleteFileFilterButton_clicked(self):
103 """
104 Private slot to delete the selected filter entries.
105 """
106 yes = EricMessageBox.yesNo(
107 self,
108 self.tr("Delete Selected Filters"),
109 self.tr("""Shall the selected filters really be deleted?"""),
110 )
111 if yes:
112 for itm in self.fileFiltersList.selectedItems():
113 self.fileFiltersList.takeTopLevelItem(
114 self.fileFiltersList.indexOfTopLevelItem(itm)
115 )
116 del itm
117
118 @pyqtSlot()
119 def on_defaultFiltersButton_clicked(self):
120 """
121 Private slot to create the default list of file filters.
122 """
123 if self.fileFiltersList.topLevelItemCount():
124 ok = EricMessageBox.yesNo(
125 self,
126 self.tr("Default Filters"),
127 self.tr(
128 "Do you really want to clear the list of defined file filters and"
129 " replace it with the list of default filters?"
130 ),
131 )
132 if not ok:
133 return
134
135 openFileFiltersList = (
136 Lexers.getOpenFileFiltersList(False, withAdditional=False)
137 + Preferences.getEditor("AdditionalOpenFilters")[:]
138 )
139
140 filters = {}
141 for openFileFilter in openFileFiltersList:
142 name, pattern = openFileFilter.split(" (", 1)
143 pattern = ";".join(pattern.strip().rstrip(")").split())
144 filters[name.strip()] = pattern
145
146 self.__populateFilters(filters)
147
148 def __getFiltersList(self, forEdit=False):
149 """
150 Private method to get the list of defined filter names.
151
152 @param forEdit flag indicating a list for an edit operation
153 (defaults to False)
154 @type bool (optional)
155 @return list of defined filter names
156 @rtype list of str
157 """
158 selectedItems = self.fileFiltersList.selectedItems() if forEdit else []
159
160 filters = []
161 for row in range(self.fileFiltersList.topLevelItemCount()):
162 itm = self.fileFiltersList.topLevelItem(row)
163 if itm not in selectedItems:
164 filters.append(itm.text(0))
165
166 return filters
167
168 def getFilters(self):
169 """
170 Public method to retrieve the edited filter list.
171
172 @return dictionary containing the defined file filters
173 @rtype dict
174 """
175 filters = {}
176 for row in range(self.fileFiltersList.topLevelItemCount()):
177 itm = self.fileFiltersList.topLevelItem(row)
178 filters[itm.text(0)] = itm.text(1)
179
180 return filters

eric ide

mercurial