diff --git a/mesongui.py b/mesongui.py index 6dd42c30f..d99862449 100755 --- a/mesongui.py +++ b/mesongui.py @@ -14,11 +14,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -import sys, os, pickle -import build, coredata +import sys, os, pickle, time, shutil +import build, coredata, environment from PyQt5 import uic from PyQt5.QtWidgets import QApplication, QMainWindow, QHeaderView -from PyQt5.QtCore import QAbstractItemModel, QModelIndex, QVariant +from PyQt5.QtCore import QAbstractItemModel, QModelIndex, QVariant, QTimer import PyQt5.QtCore class PathModel(QAbstractItemModel): @@ -183,6 +183,45 @@ class DependencyModel(QAbstractItemModel): def parent(self, index): return QModelIndex() +class ProcessRunner(): + def __init__(self, rundir, cmdlist): + self.cmdlist = cmdlist + self.ui = uic.loadUi('mesonrunner.ui') + self.timer = QTimer(self.ui) + self.timer.setInterval(1000) + self.timer.timeout.connect(self.timeout) + self.process = PyQt5.QtCore.QProcess() + self.process.setProcessChannelMode(PyQt5.QtCore.QProcess.MergedChannels) + self.process.setWorkingDirectory(rundir) + self.process.readyRead.connect(self.read_data) + self.process.finished.connect(self.finished) + self.ui.termbutton.clicked.connect(self.terminated) + self.process.start(self.cmdlist[0], self.cmdlist[1:]) + self.timer.start() + self.start_time = time.time() + self.ui.exec() + + def read_data(self): + while(self.process.canReadLine()): + txt = bytes(self.process.readLine()).decode('utf8') + self.ui.console.append(txt) + + def finished(self): + self.read_data() + self.ui.termbutton.setText('Done') + self.timer.stop() + + def terminated(self, foo): + self.process.kill() + self.timer.stop() + self.ui.done(0) + + def timeout(self): + now = time.time() + duration = int(now - self.start_time) + msg = 'Compile time: %d:%d' % (duration // 60, duration % 60) + self.ui.timelabel.setText(msg) + class MesonGui(): def __init__(self, build_dir): uifile = 'mesonmain.ui' @@ -212,6 +251,9 @@ class MesonGui(): hv = QHeaderView(1) hv.setModel(self.dep_model) self.ui.dep_view.setHeader(hv) + self.ui.compile_button.clicked.connect(self.compile) + self.ui.test_button.clicked.connect(self.run_tests) + self.ui.install_button.clicked.connect(self.install) self.ui.show() def fill_data(self): @@ -224,6 +266,19 @@ class MesonGui(): btype = 'Cross build' self.ui.buildtype_label.setText(btype) + def run_process(self, cmdlist): + cmdlist = [shutil.which(environment.detect_ninja())] + cmdlist + dialog = ProcessRunner(self.build.environment.build_dir, cmdlist) + + def compile(self, foo): + self.run_process([]) + + def run_tests(self, foo): + self.run_process(['test']) + + def install(self, foo): + self.run_process(['install']) + if __name__ == '__main__': app = QApplication(sys.argv) if len(sys.argv) != 2: diff --git a/mesonmain.ui b/mesonmain.ui index 12c9d7c77..6f2c967eb 100644 --- a/mesonmain.ui +++ b/mesonmain.ui @@ -167,6 +167,31 @@ + + + + + + Compile + + + + + + + Run tests + + + + + + + Install + + + + +