diff -r bd0eff406c6b -r dc171b1d8261 eric6/Preferences/ProgramsDialog.py --- a/eric6/Preferences/ProgramsDialog.py Tue Feb 18 19:38:58 2020 +0100 +++ b/eric6/Preferences/ProgramsDialog.py Wed Feb 19 19:38:36 2020 +0100 @@ -53,6 +53,12 @@ self.searchButton.setToolTip( self.tr("Press to search for programs")) + self.showComboBox.addItems([ + self.tr("All Supported Tools"), + self.tr("Available Tools Only"), + self.tr("Unavailable Tools Only"), + ]) + def show(self): """ Public slot to show the dialog. @@ -336,8 +342,8 @@ ) self.programsList.sortByColumn(0, Qt.AscendingOrder) - self.on_showUnavailableCheckBox_toggled( - self.showUnavailableCheckBox.isChecked()) + self.on_showComboBox_currentIndexChanged( + self.showComboBox.currentIndex()) QApplication.restoreOverrideCursor() self.__hasSearched = True @@ -378,7 +384,6 @@ font.setBold(True) itm.setFont(0, font) rememberedExe = exe - available = True if not exe: itm.setText(1, self.tr("(not configured)")) else: @@ -388,6 +393,7 @@ else: exe = Utilities.getExecutablePath(exe) if exe: + available = True if ( versionCommand and (versionStartsWith != "" or @@ -440,21 +446,21 @@ version = self.tr("(not executable)") available = False if exeModule: - QTreeWidgetItem(itm, [ + citm = QTreeWidgetItem(itm, [ "{0} {1}".format(exe, " ".join(exeModule)), version]) else: - QTreeWidgetItem(itm, [exe, version]) + citm = QTreeWidgetItem(itm, [exe, version]) + citm.setData(0, self.ToolAvailableRole, available) itm.setExpanded(True) else: if itm.childCount() == 0: itm.setText(1, self.tr("(not found)")) else: - QTreeWidgetItem(itm, [rememberedExe, - self.tr("(not found)")]) + citm = QTreeWidgetItem( + itm, [rememberedExe, self.tr("(not found)")]) + citm.setData(0, self.ToolAvailableRole, False) itm.setExpanded(True) - available = False - itm.setData(0, self.ToolAvailableRole, available) QApplication.processEvents() self.programsList.header().resizeSections(QHeaderView.ResizeToContents) self.programsList.header().setStretchLastSection(True) @@ -472,39 +478,52 @@ font = itm.font(0) font.setBold(True) itm.setFont(0, font) - available = True if len(entryVersion): - QTreeWidgetItem(itm, [entryText, entryVersion]) + citm = QTreeWidgetItem(itm, [entryText, entryVersion]) itm.setExpanded(True) - if entryVersion.startswith("("): - # assume version starting with '(' is an unavailability - # indicator - available = False + citm.setData(0, self.ToolAvailableRole, + not entryVersion.startswith("(")) + # assume version starting with '(' is an unavailability else: itm.setText(1, self.tr("(not found)")) - available = False - itm.setData(0, self.ToolAvailableRole, available) QApplication.processEvents() self.programsList.header().resizeSections(QHeaderView.ResizeToContents) self.programsList.header().setStretchLastSection(True) - @pyqtSlot(bool) - def on_showUnavailableCheckBox_toggled(self, checked): + @pyqtSlot(int) + def on_showComboBox_currentIndexChanged(self, index): """ - Private slot show or hide entries belonging to unavailable but - supported tools. + Private slot to apply the selected show criteria. - @param checked state of the check box - @type bool + @param index index of the show criterium + @type int """ - for index in range(self.programsList.topLevelItemCount()): - itm = self.programsList.topLevelItem(index) - itm.setHidden(not checked and - not itm.data(0, self.ToolAvailableRole)) -# TODO: change filter to a selection combo with -# All Supported Tools -# Found Tools Only -# Unavailable Tools Only -# TODO: add available flag to each child item and derive parent status from -# them + if index == 0: + # All Supported Tools + for topIndex in range(self.programsList.topLevelItemCount()): + topItem = self.programsList.topLevelItem(topIndex) + for childIndex in range(topItem.childCount()): + topItem.child(childIndex).setHidden(False) + topItem.setHidden(False) + else: + # 1 = Available Tools Only + # 2 = Unavailable Tools Only + for topIndex in range(self.programsList.topLevelItemCount()): + topItem = self.programsList.topLevelItem(topIndex) + if topItem.childCount() == 0: + topItem.setHidden(index == 1) + else: + availabilityList = [] + for childIndex in range(topItem.childCount()): + childItem = topItem.child(childIndex) + available = childItem.data(0, self.ToolAvailableRole) + if index == 1: + childItem.setHidden(not available) + else: + childItem.setHidden(available) + availabilityList.append(available) + if index == 1: + topItem.setHidden(not any(availabilityList)) + else: + topItem.setHidden(all(availabilityList))