def test_remove_filter(self): model = FilterCheckboxListModel() model.set_list(self.data) model.set_filter('b') model.remove_filter() self.assertFalse(model._is_filtered) self.assertEqual(model._selected, set(self.data)) self.assertEqual(model.rowCount(), 8)
class FilterWidget(QWidget): okPressed = Signal() cancelPressed = Signal() def __init__(self, parent=None): super().__init__(parent) # parameters self._filter_state = set() self._filter_empty_state = False self._search_text = '' self.search_delay = 200 # create ui elements self._ui_vertical_layout = QVBoxLayout(self) self._ui_list = QListView() self._ui_edit = QLineEdit() self._ui_edit.setPlaceholderText('Search') self._ui_edit.setClearButtonEnabled(True) self._ui_buttons = QDialogButtonBox(QDialogButtonBox.Cancel | QDialogButtonBox.Ok) self._ui_vertical_layout.addWidget(self._ui_edit) self._ui_vertical_layout.addWidget(self._ui_list) self._ui_vertical_layout.addWidget(self._ui_buttons) # add models # used to limit search so it doesn't search when typing self._search_timer = QTimer() self._search_timer.setSingleShot(True) self._filter_model = FilterCheckboxListModel() self._filter_model.set_list(self._filter_state) self._ui_list.setModel(self._filter_model) # connect signals self._ui_list.clicked.connect(self._filter_model.click_index) self._search_timer.timeout.connect(self._filter_list) self._ui_edit.textChanged.connect(self._text_edited) self._ui_buttons.button(QDialogButtonBox.Ok).clicked.connect( self._apply_filter) self._ui_buttons.button(QDialogButtonBox.Cancel).clicked.connect( self._cancel_filter) def save_state(self): """Saves the state of the FilterCheckboxListModel""" self._filter_state = self._filter_model.get_selected() self._filter_empty_state = self._filter_model._empty_selected def reset_state(self): """Sets the state of the FilterCheckboxListModel to saved state""" self._filter_model.set_selected(self._filter_state, self._filter_empty_state) def clear_filter(self): """Selects all items in FilterCheckBoxListModel""" self._filter_model.reset_selection() self.save_state() def has_filter(self): """Returns true if any item is filtered in FilterCheckboxListModel false otherwise""" return not self._filter_model._all_selected def set_filter_list(self, data): """Sets the list of items to filter""" self._filter_state = set(data) self._filter_empty_state = True self._filter_model.set_list(self._filter_state) def _apply_filter(self): """apply current filter and save state""" self._filter_model.apply_filter() self.save_state() self._ui_edit.setText('') self.okPressed.emit() def _cancel_filter(self): """cancel current edit of filter and set the state to the stored state""" self._filter_model.remove_filter() self.reset_state() self._ui_edit.setText('') self.cancelPressed.emit() def _filter_list(self): """filter list with current text""" # filter model self._filter_model.set_filter(self._search_text) def _text_edited(self, new_text): """callback for edit text, starts/restarts timer""" # start timer after text is edited, restart timer if text # is edited before last time is out. self._search_text = new_text self._search_timer.start(self.search_delay)