Skip to content

Commit

Permalink
Add possibility to edit filter
Browse files Browse the repository at this point in the history
  • Loading branch information
jfeil committed Mar 21, 2022
1 parent f79f857 commit 42dc7f6
Showing 1 changed file with 71 additions and 25 deletions.
96 changes: 71 additions & 25 deletions src/filter_editor.py
Original file line number Diff line number Diff line change
@@ -1,35 +1,83 @@
from datetime import datetime
from typing import Dict, Tuple, Callable
from typing import Dict, Tuple, Callable, Union, Any

from PySide6.QtCore import Qt
from PySide6.QtWidgets import QDialog, QLineEdit, QCheckBox, QDateEdit, QSpinBox
from PySide6.QtWidgets import QDialog, QLineEdit, QCheckBox, QDateEdit, QSpinBox, QPushButton, QDialogButtonBox

from src.datatypes import QuestionParameters, FilterOption
from src.ui_filter_editor import Ui_FilterEditor


class FilterEditor(QDialog, Ui_FilterEditor):
def __init__(self, filter_configuration: Dict[str, QuestionParameters], current_filter=None, parent=None,
window_flags=Qt.Dialog):
def __init__(self, filter_configuration: Dict[str, QuestionParameters],
current_filter: Union[None, Tuple[str, FilterOption, Any]] = None,
# dict_key, FilterOption, filter_data
parent=None, window_flags=Qt.Dialog):
super(FilterEditor, self).__init__(parent, window_flags)
self.ui = Ui_FilterEditor()
self.ui.setupUi(self)

self.ui.buttonBox.clicked.connect(self.__handle_buttonbox)

self.filter = None

self.filter_configuration = filter_configuration

self.ui.combobox_column.addItems(
[filterparams.table_header for filterparams in self.filter_configuration.values()])

self.ui.combobox_column.currentIndexChanged.connect(self.__update_filteroptions)

if current_filter:
self.setWindowTitle("Filter bearbeiten")
dict_key, filter_option, filter_value = current_filter
index = list(self.filter_configuration).index(dict_key)
self.ui.combobox_column.setCurrentIndex(index)
index = self.filter_configuration[dict_key].filter_options.index(filter_option)
self.ui.combobox_filteroption.setCurrentIndex(index)
self.__set_filter_data(filter_value)
else:
self.setWindowTitle("Filter erstellen")
self.__update_filteroptions(self.ui.combobox_column.currentIndex())

self.filter_configuration = filter_configuration
def __handle_buttonbox(self, button: QPushButton):
button_role = self.ui.buttonBox.buttonRole(button)
if button_role == QDialogButtonBox.ButtonRole.DestructiveRole:
self.reject()
elif button_role == QDialogButtonBox.ButtonRole.AcceptRole:
self.accept()

self.ui.combobox_column.addItems(
[filterparams.table_header for filterparams in self.filter_configuration.values()])
self.update_filteroptions(self.ui.combobox_column.currentIndex())
def __set_filter_data(self, data) -> None:
_, parameters, _ = self.__current_selection_state()

self.ui.combobox_column.currentIndexChanged.connect(self.update_filteroptions)
if parameters.datatype == str:
self.filter.setText(data)
elif parameters.datatype == bool:
self.filter.setCheckState(data * 2)
elif parameters.datatype == datetime:
self.filter.setDate(data)
elif parameters.datatype == int:
self.filter.setValue(data)
else:
raise ValueError('Invalid datatype!')

def __get_filter_data(self) -> Any:
_, parameters, _ = self.__current_selection_state()

def update_filteroptions(self, index):
if parameters.datatype == str:
value = self.filter.text()
elif parameters.datatype == bool:
value = self.filter.isChecked()
elif parameters.datatype == datetime:
value = self.filter.date()
elif parameters.datatype == int:
value = self.filter.value()
else:
raise ValueError('Invalid datatype!')

return value

def __update_filteroptions(self, index):
self.ui.combobox_filteroption.clear()

current_params = list(self.filter_configuration.values())[index]
Expand All @@ -49,28 +97,26 @@ def update_filteroptions(self, index):
elif current_params.datatype == int:
self.filter = QSpinBox()
else:
return
raise ValueError('Invalid FilterOption!')

self.ui.gridLayout.addWidget(self.filter, 2, 1, 1, 1)

def create_filter(self) -> Tuple[str, Callable]:
# ('answer_text', lambda x: 'FaD' in x)
def __current_selection_state(self):
index = self.ui.combobox_column.currentIndex()
dict_key, parameters = list(self.filter_configuration.items())[index]
parameters = parameters # type: QuestionParameters

filter_option = parameters.filter_options[self.ui.combobox_filteroption.currentIndex()]

if parameters.datatype == str:
value = self.filter.text()
elif parameters.datatype == bool:
value = self.filter.isChecked()
elif parameters.datatype == datetime:
value = self.filter.date()
elif parameters.datatype == int:
value = self.filter.value()
else:
raise ValueError('Invalid datatype!')
return dict_key, parameters, filter_option

def current_configuration(self) -> Tuple[str, FilterOption, Any]:
dict_key, _, filter_option = self.__current_selection_state()
return dict_key, filter_option, self.__get_filter_data()

def create_filter(self) -> Tuple[str, Callable]:
# ('answer_text', lambda x: 'FaD' in x)
dict_key, parameters, filter_option = self.__current_selection_state()

value = self.__get_filter_data()

if filter_option == FilterOption.smaller_equal:
def filter_callable(x):
Expand Down

0 comments on commit 42dc7f6

Please sign in to comment.