diff --git a/src/datatypes.py b/src/datatypes.py index 3267af0..c73369e 100644 --- a/src/datatypes.py +++ b/src/datatypes.py @@ -102,7 +102,7 @@ class Question(Base): last_edited = Column(Date, default=date.today) signature = Column(String, default=(lambda: uuid.uuid4().hex), primary_key=True) - table_headers = { + dict_to_header = { 'group_id': "Regelgruppe", 'rule_id': "Regelnummer", 'question': "Frage", @@ -114,6 +114,8 @@ class Question(Base): 'signature': "Signatur" } + header_to_dict = {y: x for x, y in dict_to_header.items()} + # noinspection PyTypeChecker def table_checkbox(self, dict_key): return defaultdict(lambda: None, { diff --git a/src/main_application.py b/src/main_application.py index ba4c558..a6fedf4 100644 --- a/src/main_application.py +++ b/src/main_application.py @@ -172,7 +172,6 @@ def create_ruletabs(self, rulegroups: List[Rulegroup]): self.ui.tabWidget.addTab(tab, "") self.ui.tabWidget.setTabText(self.ui.tabWidget.indexOf(tab), f"{rulegroup.id:02d} {rulegroup.name}") # self.filter_column(3, 'FaD') - # self.filter_column(3, 'VW') def setup_regeltest(self): regeltest_setup = RegeltestSetup(self) @@ -181,10 +180,12 @@ def setup_regeltest(self): self.ui.regeltest_list.add_question(question) def filter_column(self, column, keyword, mode=FilterMode.Include): + # RuleSortFilterProxyModel.add_filter(('answer_text', lambda x: 'FaD' in x)) + # RuleSortFilterProxyModel.add_filter(('last_edited', lambda x: datetime.date.fromisoformat('2020-06-01') < x)) + for (filter_model, _) in self.ruletabs.values(): - filter_model = filter_model # type: QSortFilterProxyModel - filter_model.setFilterFixedString(keyword) - filter_model.setFilterKeyColumn(column) + filter_model = filter_model # type: RuleSortFilterProxyModel + filter_model.invalidateFilter() def create_regeltest(self): question_set = [] diff --git a/src/question_table.py b/src/question_table.py index cd0817a..c362d48 100644 --- a/src/question_table.py +++ b/src/question_table.py @@ -1,4 +1,4 @@ -from typing import Union, Any, List +from typing import Union, Any, List, Callable, Tuple import PySide6 from PySide6.QtCore import Qt, QPoint, QAbstractTableModel, QSortFilterProxyModel @@ -10,6 +10,8 @@ from src.datatypes import Question from src.question_editor import QuestionEditor +dict_key = str + class RuleDataModel(QAbstractTableModel): # When subclassing QAbstractTableModel, you must implement rowCount(), columnCount(), and data(). Default @@ -64,10 +66,15 @@ def removeColumns(self, column: int, count: int, self.endRemoveColumns() return True - def data(self, index: Union[PySide6.QtCore.QModelIndex, PySide6.QtCore.QPersistentModelIndex], + def data(self, index: Union[PySide6.QtCore.QModelIndex, PySide6.QtCore.QPersistentModelIndex, int], role: int = ...) -> Any: - col = index.column() - row = index.row() + if type(index) == int: + row = index + col = 0 + else: + col = index.column() + row = index.row() + if role == Qt.UserRole: return self.questions[row] @@ -96,7 +103,7 @@ def headerData(self, section: int, orientation: PySide6.QtCore.Qt.Orientation, r if orientation == Qt.Vertical: return None if role == Qt.DisplayRole: - return Question.table_headers[self.headers[section]] + return Question.dict_to_header[self.headers[section]] def insertRows(self, row: int, count: int, parent: Union[PySide6.QtCore.QModelIndex, PySide6.QtCore.QPersistentModelIndex] = ...) -> bool: @@ -262,4 +269,19 @@ def startDrag(self, supportedActions: Qt.DropActions) -> None: class RuleSortFilterProxyModel(QSortFilterProxyModel): - pass + filters = [] # List[Tuple[dict_key, Callable]] + + def filterAcceptsRow(self, source_row: int, source_parent: Union[ + PySide6.QtCore.QModelIndex, PySide6.QtCore.QPersistentModelIndex]) -> bool: + if not RuleSortFilterProxyModel.filters: + return True + + cur_question = self.sourceModel().data(source_row, Qt.UserRole) + for target, filter_function in RuleSortFilterProxyModel.filters: + if filter_function(cur_question.__dict__[target]): + return True + return False + + @staticmethod + def add_filter(filter_param: Tuple[dict_key, Callable]): + RuleSortFilterProxyModel.filters += [filter_param]