sakharamg's picture
Uploading all files
158b61b
# -*- coding: utf-8 -*-
"""
Module implementing MainWindow.
"""
from PyQt4.QtCore import (
pyqtSignature,
QObject,
Qt,
SIGNAL,
)
from PyQt4.QtGui import (
QMainWindow,
QMessageBox,
QProgressDialog,
)
import sys
import threading
from Ui_mainWindow import Ui_MainWindow
from addMTModel import AddMTModelDialog
from chooseMTModel import ChooseMTModelDialog
from engine import Engine
from credits import DlgCredits
from util import doAlert
class MainWindow(QMainWindow, Ui_MainWindow):
"""
Class documentation goes here.
"""
def setupUi(self, mainWindow):
super(MainWindow, self).setupUi(mainWindow)
self.tableView.setModel(self.datamodel)
self.tableView.hideColumn(0)
# Change status and keep the column.
QObject.connect(
self.datamodel, SIGNAL("recordUpdated(bool)"),
self.on_datamodel_recordUpdated)
QObject.connect(
self.datamodel, SIGNAL("messageBox(QString)"),
self.on_datamodel_messageBox)
# The response to change model.
for obj in (self.editModelName, self.editSrcLang, self.editTrgLang):
obj.installEventFilter(self)
def __init__(self, parent=None, dm=None, moses=None, workdir=None):
"""
Constructor
"""
QMainWindow.__init__(self, parent)
self.moses = moses
self.datamodel = dm
self.engine = None
self.progress = None
self.workdir = workdir
@pyqtSignature("")
def on_delModelBtn_clicked(self):
"""
Slot documentation goes here.
"""
current = self.tableView.currentIndex()
if not current or current.row() < 0:
return
model_in_use = (
self.engine and
self.datamodel.getRowID(current.row()) == self.engine.model['ID']
)
if model_in_use:
text = (
"The model is still in use, do you want to "
"stop and delete it?\n"
"It might take a while..."
)
reply = QMessageBox.question(
None, 'Message', text, QMessageBox.Yes, QMessageBox.No)
if reply == QMessageBox.No:
return
t = self.stopEngine(self.engine)
t.join()
self.engine = None
self.clearPanel()
self.datamodel.delModel(current.row())
@pyqtSignature("")
def on_newModelBtn_clicked(self):
"""
Slot documentation goes here.
"""
dialog = AddMTModelDialog(self, self.workdir)
if dialog.exec_():
installParam = {
'modelName': dialog.modelName,
'source': dialog.source,
'sourceMode': dialog.sourceMode,
'dest': dialog.dest,
}
self.datamodel.installModel(installParam)
self.tableView.selectRow(self.tableView.model().rowCount() - 1)
# self.datamodel.newEntry()
def on_datamodel_recordUpdated(self, bRecord):
# Deal with the selection changed problem.
try:
if bRecord:
current = self.tableView.currentIndex()
if current and current.row() != -1:
self.curSelection = current.row()
else:
self.curSelection = None
else:
if self.curSelection is not None:
self.tableView.selectRow(self.curSelection)
except Exception, e:
print >> sys.stderr, str(e)
def on_datamodel_messageBox(self, str):
doAlert(str)
def closeEvent(self, event):
# Clear up.
if self.datamodel.destroy():
event.accept()
else:
event.reject()
def eventFilter(self, obj, event):
for obj in (self.editModelName, self.editSrcLang, self.editTrgLang):
if self.gridLayout.indexOf(obj) != -1:
if event.type() == event.MouseButtonPress:
dialog = ChooseMTModelDialog(self, self.datamodel)
if dialog.exec_():
# Get the model.
model = {
'ID': dialog.ID,
'name': dialog.modelName,
'srclang': dialog.srcLang,
'trglang': dialog.trgLang,
'path': dialog.path,
'mosesini': dialog.mosesini,
}
self.startEngine(model)
return True # We handle it here.
return super(MainWindow, self).eventFilter(obj, event)
def stopEngine(self, engine):
# Stop the engine with another thread.
def stopEngineThread():
engine.stop()
t = threading.Thread(target=stopEngineThread)
t.start()
return t
def startEngine(self, model):
self.editModelName.setText(model['name'])
self.editSrcLang.setText(model['srclang'])
self.editTrgLang.setText(model['trglang'])
self.editSrc.setText("")
self.editTrg.setText("")
try:
if self.engine:
self.stopEngine(self.engine)
self.engine = None
# Create engine.
self.engine = Engine(model, self.moses)
# Create progress bar dialog.
if self.progress:
self.progress.close()
self.progress = None
self.progress = QProgressDialog(
"Model: %s" % model['name'], "Cancel", 0,
self.engine.countSteps(), self)
self.progress.setAutoReset(True)
self.progress.setAutoClose(True)
self.progress.setWindowModality(Qt.WindowModal)
self.progress.setWindowTitle('Loading Model...')
QObject.connect(
self.progress, SIGNAL("canceled()"), self.progressCancelled)
self.progress.show()
# Connect engine signal.
QObject.connect(
self.engine, SIGNAL("stepFinished(int)"),
self.engineStepFinished)
QObject.connect(
self.engine, SIGNAL("loaded(bool, QString)"),
self.engineLoaded)
def startEngineThread():
self.engine.start()
t = threading.Thread(target=startEngineThread)
t.start()
except Exception, e:
if self.engine:
self.stopEngine(self.engine)
self.engine = None
self.clearPanel()
doAlert("Error start MT engine: " + str(e))
def clearPanel(self):
if self.engine:
self.stopEngine(self.engine)
self.engine = None
self.editModelName.setText("")
self.editSrcLang.setText("")
self.editTrgLang.setText("")
self.editSrc.setText("")
self.editTrg.setText("")
def progressCancelled(self):
self.clearPanel()
if self.engine:
self.stopEngine(self.engine)
self.engine = None
if self.progress:
self.progress = None
def engineStepFinished(self, nStep):
if self.progress:
self.progress.setValue(nStep)
def engineLoaded(self, success, message):
if not success:
self.clearPanel()
if message:
doAlert(message)
else:
if self.progress:
self.progress.setValue(self.progress.maximum())
self.progress = None
@pyqtSignature("")
def on_btnTranslate_clicked(self):
"""
Slot documentation goes here.
"""
if self.engine is None:
doAlert("Please load MT model first.")
return
self.btnTranslate.setEnabled(False)
self.editTrg.setText("")
try:
texts = str(self.editSrc.toPlainText().toUtf8()).split('\n')
trans = []
for text in texts:
if text.strip() == "":
trans.append(text)
else:
trans.append(
self.engine.translate(
text.replace('\r', ' ').strip()).decode('utf8'))
self.editTrg.setText('\n'.join(trans))
except Exception, e:
print >> sys.stderr, str(e)
doAlert("Translation failed!")
self.btnTranslate.setEnabled(True)
self.btnTranslate.setFocus()
@pyqtSignature("QString")
def on_labelInfo_linkActivated(self, link):
"""
Slot documentation goes here.
"""
dialog = DlgCredits(self)
dialog.exec_()