[100] | 1 | import logging
|
---|
| 2 | import sys
|
---|
| 3 | from typing import List, Optional
|
---|
| 4 |
|
---|
| 5 | from PyQt5 import QtCore
|
---|
| 6 | from PyQt5.QtWidgets import QWidget, QTextEdit, QGridLayout, QPushButton, \
|
---|
| 7 | QApplication, QMainWindow
|
---|
| 8 | from tudelft_utilities_logging.Reporter import Reporter
|
---|
| 9 |
|
---|
| 10 | from geniusweb.simplerunner.ClassPathConnectionFactory import ClassPathConnectionFactory
|
---|
| 11 | from geniusweb.simplerunner.Runner import Runner
|
---|
| 12 | from geniusweb.simplerunner.gui.SettingsPanel import SettingsPanel
|
---|
| 13 |
|
---|
| 14 |
|
---|
| 15 | class GUI (QWidget):
|
---|
| 16 | '''
|
---|
| 17 | Simple GUI allowing users to create the settings interactively, much like on
|
---|
| 18 | the runserver
|
---|
| 19 | '''
|
---|
| 20 | # dataChannel needed to pipe output text from the runner
|
---|
| 21 | # into the PyQt system
|
---|
| 22 | dataChannel = QtCore.pyqtSignal(str)
|
---|
| 23 |
|
---|
| 24 | def __init__(self):
|
---|
| 25 | super().__init__()
|
---|
| 26 | self.dataChannel.connect(self.receive)
|
---|
| 27 | self.resultarea = QTextEdit()
|
---|
| 28 | self.resultarea.setReadOnly(True)
|
---|
| 29 | self.resultarea.setText("Results will appear here after run")
|
---|
| 30 | # set dimension , 9, 40
|
---|
| 31 |
|
---|
| 32 | layout = QGridLayout()
|
---|
| 33 | self.setLayout(layout)
|
---|
| 34 |
|
---|
| 35 | self.settingsPanel = SettingsPanel()
|
---|
| 36 | layout.addWidget(self.settingsPanel)
|
---|
| 37 | layout.addWidget(self.startPanel())
|
---|
| 38 |
|
---|
| 39 | def startPanel(self) -> QWidget:
|
---|
| 40 | startpanel = QWidget()
|
---|
| 41 | layout = QGridLayout()
|
---|
| 42 | startpanel.setLayout(layout)
|
---|
| 43 |
|
---|
| 44 | startbutton = QPushButton()
|
---|
| 45 | startbutton.setText("Start Session")
|
---|
| 46 | layout.addWidget(startbutton)
|
---|
| 47 | layout.addWidget(self.resultarea)
|
---|
| 48 |
|
---|
| 49 | this = self
|
---|
| 50 | startbutton.clicked.connect(this.runsession) # type:ignore
|
---|
| 51 | return startpanel;
|
---|
| 52 |
|
---|
| 53 | def runsession(self, b):
|
---|
| 54 | self.resultarea.setText("")
|
---|
| 55 | this = self
|
---|
| 56 |
|
---|
| 57 | class MyReporter(Reporter):
|
---|
| 58 |
|
---|
| 59 | # override
|
---|
| 60 | def log(self, level:int, msg:str, thrown:Optional[BaseException]=None):
|
---|
| 61 | text = "[" + logging._levelToName[level] + "] " + msg + "\n"
|
---|
| 62 | # in python you can not turn a exception into a string
|
---|
| 63 | if thrown:
|
---|
| 64 | text = text + str(thrown) + "\n"
|
---|
| 65 | this.dataChannel.emit(text)
|
---|
| 66 |
|
---|
| 67 | myreporter = MyReporter()
|
---|
| 68 | runner = Runner(self.settingsPanel.getSettings(),
|
---|
| 69 | ClassPathConnectionFactory(), myreporter, 0)
|
---|
| 70 | runner.run()
|
---|
| 71 |
|
---|
| 72 | def receive(self, text:str):
|
---|
| 73 | self.resultarea.append(text)
|
---|
| 74 |
|
---|
| 75 | @staticmethod
|
---|
| 76 | def main(args:List[str]):
|
---|
| 77 | app = QApplication([])
|
---|
| 78 |
|
---|
| 79 | win = QMainWindow()
|
---|
| 80 | win.setWindowTitle("GeniusWeb SimpleRunner GUI")
|
---|
| 81 | win.setCentralWidget(GUI())
|
---|
| 82 | win.show()
|
---|
| 83 | sys.exit(app.exec_())
|
---|
| 84 |
|
---|
| 85 |
|
---|
| 86 | if __name__ == '__main__':
|
---|
| 87 | GUI.main([])
|
---|