From 25314fd2aed81aa5281bc3d93dbcc7919368ebe1 Mon Sep 17 00:00:00 2001 From: Bicker Date: Wed, 22 May 2019 17:45:37 +0200 Subject: Initial commit --- gui/windows/main.py | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 gui/windows/main.py (limited to 'gui/windows/main.py') diff --git a/gui/windows/main.py b/gui/windows/main.py new file mode 100644 index 0000000..4dc4ef2 --- /dev/null +++ b/gui/windows/main.py @@ -0,0 +1,139 @@ +from PyQt5.QtGui import QIcon +from PyQt5.QtWidgets import QAction +from PyQt5.QtWidgets import QFileDialog +from PyQt5.QtWidgets import QMainWindow +from PyQt5.QtWidgets import QTextEdit + +from gui.helper import append_file_extension +from gui.helper import check_errors +from gui.helper import warning +from gui.windows.form import FormWindow +from ql.ast.checkers.dependency_checker import DependencyChecker +from ql.ast.checkers.question_checker import QuestionChecker +from ql.ast.checkers.reference_checker import ReferenceChecker +from ql.ast.extractors.extractor import extract_gui_model +from ql.ast.extractors.extractor import extract_identifier_dependencies +from ql.ast.extractors.extractor import extract_identifier_scopes +from ql.ast.extractors.extractor import extract_identifier_types +from ql.ast.extractors.extractor import extract_questions +from ql.ast.visitors.type_visitor import TypeVisitor +from ql.parser.lexer import QLLexer +from ql.parser.parser import QLParser + + +class MainWindow(QMainWindow): + def __init__(self): + super().__init__() + + self.setWindowTitle('PyQuest') + self.current_file = None + self.create_menu_bar() + self.text_edit = QTextEdit() + self.setCentralWidget(self.text_edit) + + self.show() + + def create_menu_bar(self): + menu_bar = self.menuBar() + + new_file = QAction(QIcon(), 'New', self) + new_file.setShortcut('Ctrl+N') + new_file.setStatusTip('New file') + new_file.triggered.connect(self.new_file) + + open_file = QAction(QIcon(), 'Open', self) + open_file.setShortcut('Ctrl+O') + open_file.setStatusTip('Open file') + open_file.triggered.connect(self.open_file) + + save = QAction(QIcon(), 'Save', self) + save.setShortcut('Ctrl+S') + save.setStatusTip('Save file') + save.triggered.connect(self.save) + + save_file = QAction(QIcon(), 'Save as', self) + save_file.setShortcut('Ctrl+Shift+S') + save_file.setStatusTip('Save file as') + save_file.triggered.connect(self.save_file) + + create_form = QAction(QIcon(), 'Create form', self) + create_form.setShortcut('Ctrl+R') + create_form.setStatusTip('Create form') + create_form.triggered.connect(self.create_form) + + file_menu = menu_bar.addMenu('&File') + file_menu.addAction(new_file) + file_menu.addAction(open_file) + file_menu.addAction(save) + file_menu.addAction(save_file) + + create_menu = menu_bar.addMenu('&Create') + create_menu.addAction(create_form) + + def new_file(self): + self.current_file = None + self.text_edit.setText('') + + def open_file(self): + self.current_file, _ = QFileDialog.getOpenFileName(caption='Open file', directory='/home', + filter="Questionnaire language files (*.ql)") + + if self.current_file: + with open(self.current_file, 'r') as file: + self.text_edit.setText(file.read()) + + def save(self): + if self.current_file: + with open(self.current_file, 'w') as file: + file.write(self.text_edit.toPlainText()) + else: + self.save_file() + + def save_file(self): + file_name, _ = QFileDialog.getSaveFileName(caption='Save file as', directory='/home', + filter='Questionnaire language files (*.ql)') + + if file_name: + self.current_file = append_file_extension(file_name, 'ql') + with open(self.current_file, 'w') as file: + file.write(self.text_edit.toPlainText()) + + def create_form(self): + textbox_value = self.text_edit.toPlainText() + ql_lexer = QLLexer() + ql_lexer.build() + ql_parser = QLParser() + ql_parser.build() + empty_form = [] + + if not textbox_value: + empty_form.append('Empty Form') + + try: + check_errors(empty_form) + ast = ql_parser.parse(textbox_value, ql_lexer.lexer) + parse_errors = ql_parser.errors + + check_errors(parse_errors) + reference_errors = ReferenceChecker(extract_identifier_scopes(ast)).errors + + check_errors(reference_errors) + dependency_errors = DependencyChecker(extract_identifier_dependencies(ast)).errors + + check_errors(dependency_errors) + question_errors = QuestionChecker(extract_questions(ast)).errors + question_warnings = QuestionChecker(extract_questions(ast)).warnings + + if question_warnings: + warning(question_warnings) + + check_errors(question_errors) + type_visitor = TypeVisitor(extract_identifier_types(ast)) + type_visitor.visit(ast) + type_errors = type_visitor.errors + + check_errors(type_errors), + dialog = FormWindow(extract_gui_model(ast)) + dialog.exec_() + except SyntaxError: + print('Consult application popup error window for information on what went wrong.') -- cgit v1.2.3