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