diff -r 6c5877c48067 -r 87b8a0745edd Helpviewer/QtHelpFiltersDialog.py --- a/Helpviewer/QtHelpFiltersDialog.py Sun Jan 19 11:32:42 2014 +0100 +++ b/Helpviewer/QtHelpFiltersDialog.py Sun Jan 19 15:15:35 2014 +0100 @@ -11,9 +11,11 @@ from PyQt4.QtCore import pyqtSlot, Qt from PyQt4.QtGui import QDialog, QTreeWidgetItem, QListWidgetItem, \ - QInputDialog, QLineEdit + QInputDialog, QLineEdit, QItemSelectionModel from PyQt4.QtHelp import QHelpEngineCore +from E5Gui import E5MessageBox + from .Ui_QtHelpFiltersDialog import Ui_QtHelpFiltersDialog @@ -31,9 +33,10 @@ super().__init__(parent) self.setupUi(self) - self.__engine = engine + self.removeButton.setEnabled(False) + self.removeAttributeButton.setEnabled(False) - self.attributesList.header().hide() + self.__engine = engine self.filtersList.clear() self.attributesList.clear() @@ -55,6 +58,7 @@ self.filtersList.addItems(sorted(self.__filterMap.keys())) for attr in help.filterAttributes(): QTreeWidgetItem(self.attributesList, [attr]) + self.attributesList.sortItems(0, Qt.AscendingOrder) if self.__filterMap: self.filtersList.setCurrentRow(0) @@ -78,6 +82,14 @@ else: itm.setCheckState(0, Qt.Unchecked) + @pyqtSlot() + def on_filtersList_itemSelectionChanged(self): + """ + Private slot handling a change of selected filters. + """ + self.removeButton.setEnabled( + len(self.filtersList.selectedItems()) > 0) + @pyqtSlot(QTreeWidgetItem, int) def on_attributesList_itemChanged(self, item, column): """ @@ -101,6 +113,14 @@ self.__filterMap[filter] = newAtts @pyqtSlot() + def on_attributesList_itemSelectionChanged(self): + """ + Private slot handling the selection of attributes. + """ + self.removeAttributeButton.setEnabled( + len(self.attributesList.selectedItems()) != 0) + + @pyqtSlot() def on_addButton_clicked(self): """ Private slot to add a new filter. @@ -123,37 +143,76 @@ @pyqtSlot() def on_removeButton_clicked(self): """ - Private slot to remove a filter. + Private slot to remove the selected filters. """ - row = self.filtersList.currentRow() - itm = self.filtersList.takeItem(row) - if itm is None: + ok = E5MessageBox.yesNo( + self, + self.tr("Remove Filters"), + self.tr( + """Do you really want to remove the selected filters """ + """from the database?""")) + if not ok: return - del self.__filterMap[itm.text()] - self.__removedFilters.append(itm.text()) - del itm + items = self.filtersList.selectedItems() + for item in items: + itm = self.filtersList.takeItem(self.filtersList.row(item)) + if itm is None: + continue + + del self.__filterMap[itm.text()] + self.__removedFilters.append(itm.text()) + del itm + if self.filtersList.count(): - self.filtersList.setCurrentRow(row) + self.filtersList.setCurrentRow( + 0, QItemSelectionModel.ClearAndSelect) @pyqtSlot() def on_removeAttributeButton_clicked(self): """ - Private slot to remove a filter attribute. + Private slot to remove the selected filter attributes. """ - itm = self.attributesList.takeTopLevelItem( - self.attributesList.indexOfTopLevelItem( - self.attributesList.currentItem())) - if itm is None: + ok = E5MessageBox.yesNo( + self, + self.tr("Remove Attributes"), + self.tr( + """Do you really want to remove the selected attributes """ + """from the database?""")) + if not ok: return - attr = itm.text(0) - self.__removedAttributes.append(attr) + items = self.attributesList.selectedItems() + for item in items: + itm = self.attributesList.takeTopLevelItem( + self.attributesList.indexOfTopLevelItem(item)) + if itm is None: + continue + + attr = itm.text(0) + self.__removedAttributes.append(attr) + for filter in self.__filterMap: + if attr in self.__filterMap[filter]: + self.__filterMap[filter].remove(attr) + + del itm + + @pyqtSlot() + def on_unusedAttributesButton_clicked(self): + """ + Private slot to select all unused attributes. + """ + # step 1: determine all used attributes + attributes = set() for filter in self.__filterMap: - if attr in self.__filterMap[filter]: - self.__filterMap[filter].remove(attr) + attributes |= set(self.__filterMap[filter]) - del itm + # step 2: select all unused attribute items + self.attributesList.clearSelection() + for row in range(self.attributesList.topLevelItemCount()): + itm = self.attributesList.topLevelItem(row) + if itm.text(0) not in attributes: + itm.setSelected(True) def __removeAttributes(self): """