コード例 #1
0
 def test_set_list(self):
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     self.assertEqual(model._data, sorted(self.data))
     self.assertEqual(model._data_set, set(self.data))
     self.assertEqual(model._selected, set(self.data))
     self.assertTrue(model._all_selected)
コード例 #2
0
 def test_click_select_all_when_not_all_selected(self):
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     with mock.patch("tabularview_models.FilterCheckboxListModel.dataChanged") as dc:
         index = model.index(2, 0)
         model.click_index(index)
         index = model.index(0, 0)
         model.click_index(index)
     self.assertTrue(model._all_selected)
     self.assertEqual(model._selected, set(self.data))
コード例 #3
0
 def test_add_item_with_select_with_filter_middle(self):
     new_item = ['b1']
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     model.set_filter('b')
     with mock.patch("tabularview_models.FilterCheckboxListModel.beginInsertRows") as bir, \
          mock.patch("tabularview_models.FilterCheckboxListModel.endInsertRows") as eir, \
          mock.patch("tabularview_models.FilterCheckboxListModel.dataChanged") as dc:
         model.add_item(new_item)
     self.assertEqual(model._filter_index, [3,4,5,6])
     self.assertEqual(model.data(model.index(1 + 2, 0)), new_item[0])
コード例 #4
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)
コード例 #5
0
 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)
コード例 #6
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)
コード例 #7
0
 def test_click_selected_item_when_filtered(self):
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     model.set_filter('b')
     with mock.patch("tabularview_models.FilterCheckboxListModel.dataChanged") as dc:
         index = model.index(2, 0)
         model.click_index(index)
     self.assertEqual(model._selected_filtered, set(self.data[4:]))
     self.assertFalse(model._all_selected)
コード例 #8
0
 def test_add_item_with_select_with_filter_last(self):
     new_item = ['bbbb']
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     model.set_filter('b')
     with mock.patch("tabularview_models.FilterCheckboxListModel.beginInsertRows") as bir, \
          mock.patch("tabularview_models.FilterCheckboxListModel.endInsertRows") as eir, \
          mock.patch("tabularview_models.FilterCheckboxListModel.dataChanged") as dc:
         model.add_item(new_item)
     self.assertEqual(model._data, sorted(self.data + new_item))
     self.assertEqual(model._data_set, set(self.data + new_item))
     self.assertEqual(model._filter_index, [3,4,5,6])
     self.assertEqual(model._selected_filtered, set(self.data[3:] + new_item))
     self.assertEqual(model.data(model.index(3 + 2, 0)), new_item[0])
コード例 #9
0
 def test_remove_items_filtered_data_not_selected(self):
     items = set('b')
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     model.set_filter('b')
     model._selected_filtered.discard('a')
     model._all_selected = False
     with mock.patch("tabularview_models.FilterCheckboxListModel.beginResetModel") as br, \
          mock.patch("tabularview_models.FilterCheckboxListModel.endResetModel") as er:
         model.remove_items(items)
     self.assertEqual(model._selected_filtered, set(self.data[4:]))
     self.assertTrue(model._all_selected)
コード例 #10
0
 def test_remove_items_filtered_data_midle(self):
     items = set('bb')
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     model.set_filter('b')
     with mock.patch("tabularview_models.FilterCheckboxListModel.beginResetModel") as br, \
          mock.patch("tabularview_models.FilterCheckboxListModel.endResetModel") as er:
         model.remove_items(items)
     self.assertEqual(model._filter_index, [3,4])
コード例 #11
0
 def test_click_select_empty_when_unselected(self):
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     model._empty_selected = False
     with mock.patch("tabularview_models.FilterCheckboxListModel.dataChanged") as dc:
         index = model.index(1, 0)
         model.click_index(index)
     self.assertTrue(model._empty_selected)
     self.assertTrue(model._all_selected)
コード例 #12
0
 def test_click_selected_item(self):
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     with mock.patch("tabularview_models.FilterCheckboxListModel.dataChanged") as dc:
         index = model.index(2, 0)
         model.click_index(index)
     self.assertEqual(model._selected, set(self.data).difference(set(['a'])))
     self.assertFalse(model._all_selected)
コード例 #13
0
 def test_click_unselected_item(self):
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     model._selected.discard('a')
     with mock.patch("tabularview_models.FilterCheckboxListModel.dataChanged") as dc:
         index = model.index(2, 0)
         model.click_index(index)
     self.assertEqual(model._selected, set(self.data))
     self.assertTrue(model._all_selected)
コード例 #14
0
    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)
コード例 #15
0
 def test_add_item_without_select_without_filter(self):
     new_item = ['aaaa']
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     with mock.patch("tabularview_models.FilterCheckboxListModel.beginInsertRows") as bir, \
          mock.patch("tabularview_models.FilterCheckboxListModel.endInsertRows") as eir, \
          mock.patch("tabularview_models.FilterCheckboxListModel.dataChanged") as dc:
         model.add_item(new_item, selected=False)
     self.assertFalse(model._all_selected)
コード例 #16
0
 def test_remove_items_selected(self):
     items = set('a')
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     with mock.patch("tabularview_models.FilterCheckboxListModel.beginResetModel") as br, \
          mock.patch("tabularview_models.FilterCheckboxListModel.endResetModel") as er:
         model.remove_items(items)
     self.assertEqual(model._selected, set(self.data[1:]))
     self.assertTrue(model._all_selected)
コード例 #17
0
 def test_add_item_with_select_without_filter(self):
     new_item = ['aaaa']
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     with mock.patch("tabularview_models.FilterCheckboxListModel.beginInsertRows") as bir, \
          mock.patch("tabularview_models.FilterCheckboxListModel.endInsertRows") as eir, \
          mock.patch("tabularview_models.FilterCheckboxListModel.dataChanged") as dc:
         model.add_item(new_item)
     self.assertEqual(model._data, sorted(self.data + new_item))
     self.assertEqual(model._data_set, set(self.data + new_item))
コード例 #18
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)
コード例 #19
0
 def test_set_filter_index(self):
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     model.set_filter('b')
     self.assertEqual(model._filter_index, [3, 4, 5])
コード例 #20
0
 def test_is_all_selected_when_not_empty_selected(self):
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     model._empty_selected = False
     self.assertFalse(model._is_all_selected())
コード例 #21
0
 def test_is_all_selected_when_not_all_selected(self):
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     model._selected.discard('a')
     self.assertFalse(model._is_all_selected())
コード例 #22
0
 def test_is_all_selected_when_all_selected(self):
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     self.assertTrue(model._is_all_selected())
コード例 #23
0
 def test_rowCount_when_filter(self):
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     model.set_filter('b')
     self.assertEqual(model.rowCount(), 5)
コード例 #24
0
 def test_add_to_selection_when_filter(self):
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     model.set_filter('b')
     self.assertFalse(model._add_to_selection)
     self.assertFalse(model.data(model.index(1,0), Qt.CheckStateRole))
コード例 #25
0
 def test_selected_when_filtered(self):
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     model.set_filter('b')
     self.assertEqual(model._selected, set(self.data))
     self.assertEqual(model._selected_filtered, set(self.data[3:]))
コード例 #26
0
 def test_init_model(self):
     FilterCheckboxListModel()
コード例 #27
0
 def test_get_data_when_filtered(self):
     model = FilterCheckboxListModel()
     model.set_list(self.data)
     model.set_filter('b')
     self.assertEqual(model.data(model.index(2,0)), 'b')