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
+
+
+
+
+