aboutsummaryrefslogtreecommitdiff
path: root/gui/windows/form.py
blob: 64c05f887a036591878645c27be13dddf36b5e78 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QDialog
from PyQt5.QtWidgets import QDialogButtonBox
from PyQt5.QtWidgets import QFileDialog
from PyQt5.QtWidgets import QFormLayout
from PyQt5.QtWidgets import QGroupBox
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtWidgets import QVBoxLayout

from gui.helper import append_file_extension


class FormWindow(QDialog):
    def __init__(self, form_model):
        super(FormWindow, self).__init__()
        self.__form_model = form_model
        self.__form_group_box = QGroupBox()

        self.setWindowTitle('Form')
        self.create_form()

        button_box = QDialogButtonBox(QDialogButtonBox.Save | QDialogButtonBox.Cancel)
        button_box.accepted.connect(self.accept)
        button_box.rejected.connect(self.reject)

        main_layout = QVBoxLayout()
        main_layout.addWidget(self.form_group_box)
        main_layout.addWidget(button_box)
        self.setLayout(main_layout)

    @property
    def form_model(self):
        return self.__form_model

    @property
    def form_group_box(self):
        return self.__form_group_box

    def create_form(self):
        layout = QFormLayout()

        for question in self.form_model.block:
            show = question.evaluate_visibility_condition(self.form_model)
            question.pyqt5_render(layout, self.form_model, show)
            question.widget.on_change(self.form_model.update_questions_on_change)

        self.form_group_box.setLayout(layout)

    @pyqtSlot(name='accept')
    def accept(self):
        file_name, _ = QFileDialog.getSaveFileName(QFileDialog(), 'Save results', self.form_model.identifier,
                                                   'JSON (*.json);;All Files (*)')

        if file_name:
            file_name = append_file_extension(file_name, 'json')
            file = open(file_name, 'w')
            file.write(self.form_model.to_json())
            file.close()
            self.close()
            QMessageBox.information(QMessageBox(), 'Submission', 'Your answers have been submitted successfully.',
                                    QMessageBox.Close, QMessageBox.Escape)
        else:
            QMessageBox.warning(QMessageBox(), 'Warning', 'Questionnaire results were not saved.',
                                QMessageBox.Close, QMessageBox.Escape)

    @pyqtSlot(name='reject')
    def reject(self):
        self.hide()