Example #1
0
 def test_apply_filter_with_replace(self):
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     model.set_filter('b')
     model.apply_filter()
     self.assertFalse(model._is_filtered)
     self.assertEqual(model._selected, set(self.data[3:]))
     self.assertEqual(model.rowCount(), 8)
     self.assertFalse(model._empty_selected)
Example #2
0
 def test_apply_filter_with_add(self):
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     model.set_filter('b')
     model._add_to_selection = True
     model._selected_filtered.discard('bbb')
     model.apply_filter()
     self.assertFalse(model._is_filtered)
     self.assertEqual(model._selected, set(self.data[:5]))
     self.assertEqual(model.rowCount(), 8)
     self.assertFalse(model._all_selected)
Example #3
0
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)