diff options
Diffstat (limited to 'gui/model')
| -rw-r--r-- | gui/model/__pycache__/form.cpython-35.pyc | bin | 0 -> 2007 bytes | |||
| -rw-r--r-- | gui/model/__pycache__/question.cpython-35.pyc | bin | 0 -> 3248 bytes | |||
| -rw-r--r-- | gui/model/form.py | 44 | ||||
| -rw-r--r-- | gui/model/question.py | 83 |
4 files changed, 127 insertions, 0 deletions
diff --git a/gui/model/__pycache__/form.cpython-35.pyc b/gui/model/__pycache__/form.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..cd48947 --- /dev/null +++ b/gui/model/__pycache__/form.cpython-35.pyc diff --git a/gui/model/__pycache__/question.cpython-35.pyc b/gui/model/__pycache__/question.cpython-35.pyc Binary files differnew file mode 100644 index 0000000..64bb4cf --- /dev/null +++ b/gui/model/__pycache__/question.cpython-35.pyc diff --git a/gui/model/form.py b/gui/model/form.py new file mode 100644 index 0000000..3f045ce --- /dev/null +++ b/gui/model/form.py @@ -0,0 +1,44 @@ +from json import dumps + + +class FormModel: + def __init__(self, identifier): + self.__identifier = identifier + self.__block = [] + + @property + def identifier(self): + return self.__identifier + + @property + def block(self): + return self.__block + + def to_json(self): + return dumps({question.identifier: question.answer.value.get_json_value() for question in self.block}) + + def find_question_of_widget(self, widget): + for question in self.block: + if question.widget == widget: + return question + + def update_questions_on_change(self, changed_widget): + changed_question = self.find_question_of_widget(changed_widget) + + if changed_question: + new_value = changed_question.widget.get_value(changed_question.answer_type) + changed_question.answer = changed_question.answer_type.get_literal_node(new_value) + + for question in self.block: + result = question.evaluate_visibility_condition(self) + + if result: + question.widget.show() + question.widget_label.show() + else: + question.widget.hide() + question.widget_label.hide() + + if question.computed: + answer_result = str(question.evaluate_answer(self)) + question.widget.setText(answer_result) diff --git a/gui/model/question.py b/gui/model/question.py new file mode 100644 index 0000000..a45d6e2 --- /dev/null +++ b/gui/model/question.py @@ -0,0 +1,83 @@ +from gui.widgets.label import Label +from ql.ast.visitors.expression_evaluator import ExpressionEvaluator + + +class QuestionModel: + def __init__(self, label, identifier, answer_type, answer, computed, visibility_condition): + self.__label = label + self.__identifier = identifier + self.__answer_type = answer_type + self.__answer = answer + self.__computed = computed + self.__visibility_condition = visibility_condition + self.__widget = None + self.__widget_label = None + + @property + def label(self): + return self.__label + + @property + def identifier(self): + return self.__identifier + + @property + def answer_type(self): + return self.__answer_type + + @property + def answer(self): + return self.__answer + + @answer.setter + def answer(self, value): + self.__answer = value + + @property + def computed(self): + return self.__computed + + @property + def visibility_condition(self): + return self.__visibility_condition + + @property + def widget(self): + return self.__widget + + @widget.setter + def widget(self, value): + self.__widget = value + + @property + def widget_label(self): + return self.__widget_label + + @widget_label.setter + def widget_label(self, value): + self.__widget_label = value + + def evaluate_visibility_condition(self, form): + visitor = ExpressionEvaluator(form) + visitor.visit(self.visibility_condition) + return visitor.result + + def evaluate_answer(self, form): + visitor = ExpressionEvaluator(form) + visitor.visit(self.answer) + return visitor.result + + def pyqt5_render(self, layout, form, visible=True): + self.widget_label = Label(self.label) + + if self.computed: + answer_result = str(self.evaluate_answer(form)) + self.widget = Label(answer_result) + else: + self.widget = self.answer_type.pyqt5_default_widget() + + if not visible: + self.widget.hide() + self.widget_label.hide() + + layout.addRow(self.widget_label, self.widget) |