WebBrowser/QtHelp/QtHelpFiltersDialog.py

branch
QtWebEngine
changeset 4875
4ee26909ac0d
parent 4631
5c1a96925da4
child 5389
9b1c800daff3
equal deleted inserted replaced
4870:72901685681d 4875:4ee26909ac0d
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2009 - 2016 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a dialog to manage the QtHelp filters.
8 """
9
10 from __future__ import unicode_literals
11
12 import sqlite3
13
14 from PyQt5.QtCore import pyqtSlot, Qt, QItemSelectionModel
15 from PyQt5.QtWidgets import QDialog, QTreeWidgetItem, QListWidgetItem, \
16 QInputDialog, QLineEdit
17 from PyQt5.QtHelp import QHelpEngineCore
18
19 from E5Gui import E5MessageBox
20
21 from .Ui_QtHelpFiltersDialog import Ui_QtHelpFiltersDialog
22
23
24 class QtHelpFiltersDialog(QDialog, Ui_QtHelpFiltersDialog):
25 """
26 Class implementing a dialog to manage the QtHelp filters.
27 """
28 def __init__(self, engine, parent=None):
29 """
30 Constructor
31
32 @param engine reference to the help engine (QHelpEngine)
33 @param parent reference to the parent widget (QWidget)
34 """
35 super(QtHelpFiltersDialog, self).__init__(parent)
36 self.setupUi(self)
37
38 self.removeButton.setEnabled(False)
39 self.removeAttributeButton.setEnabled(False)
40
41 self.__engine = engine
42
43 self.filtersList.clear()
44 self.attributesList.clear()
45
46 help = QHelpEngineCore(self.__engine.collectionFile())
47 help.setupData()
48
49 self.__removedFilters = []
50 self.__filterMap = {}
51 self.__filterMapBackup = {}
52 self.__removedAttributes = []
53
54 for filter in help.customFilters():
55 atts = help.filterAttributes(filter)
56 self.__filterMapBackup[filter] = atts
57 if filter not in self.__filterMap:
58 self.__filterMap[filter] = atts
59
60 self.filtersList.addItems(sorted(self.__filterMap.keys()))
61 for attr in help.filterAttributes():
62 QTreeWidgetItem(self.attributesList, [attr])
63 self.attributesList.sortItems(0, Qt.AscendingOrder)
64
65 if self.__filterMap:
66 self.filtersList.setCurrentRow(0)
67
68 @pyqtSlot(QListWidgetItem, QListWidgetItem)
69 def on_filtersList_currentItemChanged(self, current, previous):
70 """
71 Private slot to update the attributes depending on the current filter.
72
73 @param current reference to the current item (QListWidgetitem)
74 @param previous reference to the previous current item
75 (QListWidgetItem)
76 """
77 checkedList = []
78 if current is not None:
79 checkedList = self.__filterMap[current.text()]
80 for index in range(0, self.attributesList.topLevelItemCount()):
81 itm = self.attributesList.topLevelItem(index)
82 if itm.text(0) in checkedList:
83 itm.setCheckState(0, Qt.Checked)
84 else:
85 itm.setCheckState(0, Qt.Unchecked)
86
87 @pyqtSlot()
88 def on_filtersList_itemSelectionChanged(self):
89 """
90 Private slot handling a change of selected filters.
91 """
92 self.removeButton.setEnabled(
93 len(self.filtersList.selectedItems()) > 0)
94
95 @pyqtSlot(QTreeWidgetItem, int)
96 def on_attributesList_itemChanged(self, item, column):
97 """
98 Private slot to handle a change of an attribute.
99
100 @param item reference to the changed item (QTreeWidgetItem)
101 @param column column containing the change (integer)
102 """
103 if self.filtersList.currentItem() is None:
104 return
105
106 filter = self.filtersList.currentItem().text()
107 if filter not in self.__filterMap:
108 return
109
110 newAtts = []
111 for index in range(0, self.attributesList.topLevelItemCount()):
112 itm = self.attributesList.topLevelItem(index)
113 if itm.checkState(0) == Qt.Checked:
114 newAtts.append(itm.text(0))
115 self.__filterMap[filter] = newAtts
116
117 @pyqtSlot()
118 def on_attributesList_itemSelectionChanged(self):
119 """
120 Private slot handling the selection of attributes.
121 """
122 self.removeAttributeButton.setEnabled(
123 len(self.attributesList.selectedItems()) != 0)
124
125 @pyqtSlot()
126 def on_addButton_clicked(self):
127 """
128 Private slot to add a new filter.
129 """
130 filter, ok = QInputDialog.getText(
131 None,
132 self.tr("Add Filter"),
133 self.tr("Filter name:"),
134 QLineEdit.Normal)
135 if not filter:
136 return
137
138 if filter not in self.__filterMap:
139 self.__filterMap[filter] = []
140 self.filtersList.addItem(filter)
141
142 itm = self.filtersList.findItems(filter, Qt.MatchCaseSensitive)[0]
143 self.filtersList.setCurrentItem(itm)
144
145 @pyqtSlot()
146 def on_removeButton_clicked(self):
147 """
148 Private slot to remove the selected filters.
149 """
150 ok = E5MessageBox.yesNo(
151 self,
152 self.tr("Remove Filters"),
153 self.tr(
154 """Do you really want to remove the selected filters """
155 """from the database?"""))
156 if not ok:
157 return
158
159 items = self.filtersList.selectedItems()
160 for item in items:
161 itm = self.filtersList.takeItem(self.filtersList.row(item))
162 if itm is None:
163 continue
164
165 del self.__filterMap[itm.text()]
166 self.__removedFilters.append(itm.text())
167 del itm
168
169 if self.filtersList.count():
170 self.filtersList.setCurrentRow(
171 0, QItemSelectionModel.ClearAndSelect)
172
173 @pyqtSlot()
174 def on_removeAttributeButton_clicked(self):
175 """
176 Private slot to remove the selected filter attributes.
177 """
178 ok = E5MessageBox.yesNo(
179 self,
180 self.tr("Remove Attributes"),
181 self.tr(
182 """Do you really want to remove the selected attributes """
183 """from the database?"""))
184 if not ok:
185 return
186
187 items = self.attributesList.selectedItems()
188 for item in items:
189 itm = self.attributesList.takeTopLevelItem(
190 self.attributesList.indexOfTopLevelItem(item))
191 if itm is None:
192 continue
193
194 attr = itm.text(0)
195 self.__removedAttributes.append(attr)
196 for filter in self.__filterMap:
197 if attr in self.__filterMap[filter]:
198 self.__filterMap[filter].remove(attr)
199
200 del itm
201
202 @pyqtSlot()
203 def on_unusedAttributesButton_clicked(self):
204 """
205 Private slot to select all unused attributes.
206 """
207 # step 1: determine all used attributes
208 attributes = set()
209 for filter in self.__filterMap:
210 attributes |= set(self.__filterMap[filter])
211
212 # step 2: select all unused attribute items
213 self.attributesList.clearSelection()
214 for row in range(self.attributesList.topLevelItemCount()):
215 itm = self.attributesList.topLevelItem(row)
216 if itm.text(0) not in attributes:
217 itm.setSelected(True)
218
219 def __removeAttributes(self):
220 """
221 Private method to remove attributes from the Qt Help database.
222 """
223 try:
224 self.__db = sqlite3.connect(self.__engine.collectionFile())
225 except sqlite3.DatabaseError:
226 pass # ignore database errors
227
228 for attr in self.__removedAttributes:
229 self.__db.execute(
230 "DELETE FROM FilterAttributeTable WHERE Name = '{0}'"
231 .format(attr))
232 self.__db.commit()
233 self.__db.close()
234
235 @pyqtSlot()
236 def on_buttonBox_accepted(self):
237 """
238 Private slot to update the database, if the dialog is accepted.
239 """
240 filtersChanged = False
241 if len(self.__filterMapBackup) != len(self.__filterMap):
242 filtersChanged = True
243 else:
244 for filter in self.__filterMapBackup:
245 if filter not in self.__filterMap:
246 filtersChanged = True
247 else:
248 oldFilterAtts = self.__filterMapBackup[filter]
249 newFilterAtts = self.__filterMap[filter]
250 if len(oldFilterAtts) != len(newFilterAtts):
251 filtersChanged = True
252 else:
253 for attr in oldFilterAtts:
254 if attr not in newFilterAtts:
255 filtersChanged = True
256 break
257
258 if filtersChanged:
259 break
260
261 if filtersChanged:
262 for filter in self.__removedFilters:
263 self.__engine.removeCustomFilter(filter)
264 for filter in self.__filterMap:
265 self.__engine.addCustomFilter(filter, self.__filterMap[filter])
266
267 if self.__removedAttributes:
268 self.__removeAttributes()
269
270 if filtersChanged or self.__removedAttributes:
271 self.__engine.setupData()
272
273 self.accept()

eric ide

mercurial