|
|
|
|
|
|
|
from PyQt4 import QtCore, QtGui |
|
|
|
import DIMputs as my_DI |
|
|
|
|
|
|
|
class MainWindow(QtGui.QWidget): |
|
updateSignal = QtCore.pyqtSignal() |
|
def __init__(self, parent=None): |
|
|
|
|
|
self.path = "" |
|
self.cur_rein_num = 0 |
|
self.data = None |
|
self.format = "" |
|
self.cell_limit = float("inf") |
|
|
|
super(MainWindow, self).__init__(parent) |
|
|
|
|
|
pathLabel = QtGui.QLabel("Path:") |
|
self.pathLabel = QtGui.QLabel(self.path) |
|
self.pathLabel.setFrameStyle(QtGui.QFrame.StyledPanel | |
|
QtGui.QFrame.Sunken) |
|
self.pathLabel.setToolTip("Current File") |
|
self.pathButton = QtGui.QPushButton("P&ath...") |
|
self.pathButton.setToolTip("Set the item you want to inspect") |
|
self.connect(self.pathButton, QtCore.SIGNAL("clicked()"), self.setPath) |
|
|
|
|
|
|
|
cell_limit_label = QtGui.QLabel("Cell Limit:") |
|
self.cell_limit_chooser = QtGui.QSpinBox() |
|
self.cell_limit_chooser.setMaximum(99999) |
|
cell_limit_label.setToolTip("Limits the number of elements per cell") |
|
self.cell_limit_chooser.setToolTip("Set to zero to show all elements") |
|
|
|
|
|
self.format_drop = QtGui.QToolButton(self) |
|
self.format_drop.setPopupMode(QtGui.QToolButton.MenuButtonPopup) |
|
self.format_drop.setMenu(QtGui.QMenu(self.format_drop)) |
|
self.format_drop.setText("Format") |
|
|
|
self.format_syntax = QtGui.QPushButton("Syntax") |
|
self.format_phrase = QtGui.QPushButton("Phrase") |
|
self.format_syntaxCube = QtGui.QPushButton("Syntax Cube (-Tall flag)") |
|
self.format_phraseStackFlag = QtGui.QPushButton("Phrase Stack (search-graph)") |
|
self.format_phraseStackVerbose = QtGui.QPushButton("Phrase Stack (verbose)") |
|
self.format_syntaxCubeFlag = QtGui.QPushButton("Syntax Cube (search-graph)") |
|
self.format_mbot = QtGui.QPushButton("MBOT") |
|
|
|
|
|
format_action_syntax = QtGui.QWidgetAction(self.format_drop) |
|
format_action_syntax.setDefaultWidget(self.format_syntax) |
|
|
|
format_action_phrase = QtGui.QWidgetAction(self.format_drop) |
|
format_action_phrase.setDefaultWidget(self.format_phrase) |
|
|
|
format_action_syntaxCube = QtGui.QWidgetAction(self.format_drop) |
|
format_action_syntaxCube.setDefaultWidget(self.format_syntaxCube) |
|
|
|
format_action_phraseStackFlag = QtGui.QWidgetAction(self.format_drop) |
|
format_action_phraseStackFlag.setDefaultWidget(self.format_phraseStackFlag) |
|
|
|
format_action_phraseStackVerbose = QtGui.QWidgetAction(self.format_drop) |
|
format_action_phraseStackVerbose.setDefaultWidget(self.format_phraseStackVerbose) |
|
|
|
format_action_syntaxCubeFlag = QtGui.QWidgetAction(self.format_drop) |
|
format_action_syntaxCubeFlag.setDefaultWidget(self.format_syntaxCubeFlag) |
|
|
|
format_action_mbot = QtGui.QWidgetAction(self.format_drop) |
|
format_action_mbot.setDefaultWidget(self.format_mbot) |
|
|
|
self.format_drop.menu().addAction(format_action_syntax) |
|
self.format_drop.menu().addAction(format_action_phrase) |
|
self.format_drop.menu().addAction(format_action_syntaxCube) |
|
self.format_drop.menu().addAction(format_action_phraseStackFlag) |
|
self.format_drop.menu().addAction(format_action_phraseStackVerbose) |
|
self.format_drop.menu().addAction(format_action_syntaxCubeFlag) |
|
self.format_drop.menu().addAction(format_action_mbot) |
|
|
|
|
|
self.format_syntax.clicked.connect(self.set_format_syntax) |
|
self.format_phrase.clicked.connect(self.set_format_phrase) |
|
self.format_syntaxCube.clicked.connect(self.set_format_syntaxCube) |
|
self.format_phraseStackFlag.clicked.connect(self.set_format_phraseStackFlag) |
|
self.format_phraseStackVerbose.clicked.connect(self.set_format_phraseStackVerbose) |
|
self.format_syntaxCubeFlag.clicked.connect(self.set_format_syntaxCubeFlag) |
|
self.format_mbot.clicked.connect(self.set_format_mbot) |
|
|
|
|
|
|
|
|
|
self.table_widget = HoverTable(self) |
|
self.w = [] |
|
|
|
|
|
|
|
self.buttonBox = QtGui.QDialogButtonBox() |
|
self.sentence_spinbox = QtGui.QSpinBox(parent=self.buttonBox) |
|
self.sentence_spinbox.setMaximum(999999) |
|
|
|
self.goto_button = self.buttonBox.addButton( |
|
"&GoTo", QtGui.QDialogButtonBox.ActionRole) |
|
self.next_button = self.buttonBox.addButton( |
|
"&Next", QtGui.QDialogButtonBox.ActionRole) |
|
self.prev_button = self.buttonBox.addButton( |
|
"&Prev", QtGui.QDialogButtonBox.ActionRole) |
|
self.next_button.clicked.connect(self.next_parse) |
|
self.prev_button.clicked.connect(self.prev_parse) |
|
self.goto_button.clicked.connect(self.cur_parse) |
|
self.quit_button = self.buttonBox.addButton( |
|
"&Quit", QtGui.QDialogButtonBox.ActionRole) |
|
self.quit_button.clicked.connect( |
|
QtCore.QCoreApplication.instance().quit) |
|
|
|
|
|
|
|
|
|
self.goto_button.setDisabled(True) |
|
self.next_button.setDisabled(True) |
|
self.prev_button.setDisabled(True) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
layout = QtGui.QVBoxLayout() |
|
|
|
topLayout = QtGui.QHBoxLayout() |
|
topLayout.addWidget(self.format_drop) |
|
topLayout.addWidget(cell_limit_label) |
|
topLayout.addWidget(self.cell_limit_chooser) |
|
self.cell_limit_chooser.valueChanged.connect(self.setCellLimit) |
|
topLayout.addWidget(pathLabel) |
|
topLayout.addWidget(self.pathLabel, 1) |
|
topLayout.addWidget(self.pathButton) |
|
|
|
bottomLayout = QtGui.QHBoxLayout() |
|
bottomLayout.addWidget(self.buttonBox) |
|
|
|
layout.addLayout(topLayout) |
|
layout.addWidget(self.table_widget) |
|
layout.addLayout(bottomLayout) |
|
|
|
self.sentence_spinbox.valueChanged.connect(self.set_cur_rein_num) |
|
|
|
self.setLayout(layout) |
|
self.updateSignal.connect(self.update_table) |
|
|
|
QtCore.QObject.connect( |
|
self.table_widget, |
|
QtCore.SIGNAL("cellDoubleClicked(int, int)"), |
|
self.popup) |
|
|
|
|
|
def closeEvent(self, *args, **kwargs): |
|
|
|
|
|
QtCore.QCoreApplication.quit() |
|
return QtGui.QWidget.closeEvent(self, *args, **kwargs) |
|
|
|
|
|
def setCellLimit(self, value): |
|
if value == 0: |
|
value = float("inf") |
|
self.cell_limit = value |
|
|
|
|
|
def setPath(self): |
|
path = QtGui.QFileDialog.getOpenFileName(self, |
|
"Select File", self.pathLabel.text()) |
|
if path: |
|
self.goto_button.setDisabled(False) |
|
self.prev_button.setDisabled(False) |
|
self.next_button.setDisabled(False) |
|
self.pathLabel.setText(QtCore.QDir.toNativeSeparators(path)) |
|
self.path = unicode(path) |
|
self.data = my_DI.DataInput(self.path) |
|
try: |
|
if self.format == "syntax": |
|
self.data.read_syntax() |
|
elif self.format == "phrase": |
|
self.data.read_phrase() |
|
elif self.format == "syntaxCube": |
|
self.data.read_syntax_cubes(self.cell_limit) |
|
elif self.format == "phraseStackFlag": |
|
self.data.read_phrase_stack_flag(self.cell_limit) |
|
elif self.format == "phraseStackVerbose": |
|
self.data.read_phrase_stack_verbose(self.cell_limit) |
|
elif self.format == "syntaxCubeFlag": |
|
self.data.read_syntax_cube_flag(self.cell_limit) |
|
elif self.format == "mbot": |
|
self.data.read_mbot(self.cell_limit) |
|
self.populate(0) |
|
self.sentence_spinbox.setValue(0) |
|
except (ValueError, IndexError) as exc: |
|
self.error_dialog = QtGui.QDialog() |
|
self.error_dialog.setModal(True) |
|
layout = QtGui.QVBoxLayout() |
|
text = QtGui.QLabel( |
|
"""Something went wrong when choosing your input format/file |
|
\n""") |
|
button = QtGui.QPushButton("Ok") |
|
button.clicked.connect(self.error_dialog.close) |
|
layout.addWidget(text) |
|
layout.addWidget(button) |
|
self.error_dialog.setLayout(layout) |
|
self.error_dialog.show() |
|
|
|
|
|
|
|
def next_parse(self): |
|
self.cur_rein_num += 1 |
|
if self.cur_rein_num < 0: |
|
self.cur_rein_num = len(self.data.sentences) + self.cur_rein_num |
|
if self.cur_rein_num >= len(self.data.sentences): |
|
self.cur_rein_num = 0 |
|
self.sentence_spinbox.setValue(self.cur_rein_num) |
|
self.populate(self.cur_rein_num) |
|
|
|
def prev_parse(self): |
|
self.cur_rein_num -= 1 |
|
if self.cur_rein_num < 0: |
|
self.cur_rein_num = len(self.data.sentences) + self.cur_rein_num |
|
if self.cur_rein_num >= len(self.data.sentences): |
|
self.cur_rein_num = 0 |
|
self.sentence_spinbox.setValue(self.cur_rein_num) |
|
self.populate(self.cur_rein_num) |
|
|
|
def cur_parse(self): |
|
if self.cur_rein_num >= len(self.data.sentences): |
|
self.cur_rein_num = 0 |
|
self.sentence_spinbox.setValue(self.cur_rein_num) |
|
self.populate(self.cur_rein_num) |
|
|
|
|
|
def set_cur_rein_num(self, value): |
|
self.cur_rein_num = value |
|
|
|
def populate(self, cur_rein_num): |
|
cur_sent = self.data.sentences[cur_rein_num] |
|
nrows, ncols = cur_sent.length + 1, cur_sent.length + 1 |
|
nrows, ncols = ncols, nrows |
|
self.table_widget.setSortingEnabled(False) |
|
self.table_widget.setRowCount(nrows) |
|
self.table_widget.setColumnCount(ncols) |
|
|
|
self.table_widget.setHorizontalHeaderLabels([str(x) for x in range(ncols)]) |
|
self.table_widget.setVerticalHeaderLabels([str(x) for x in range(nrows)]) |
|
for i in range(nrows): |
|
for j in range(ncols): |
|
try: |
|
|
|
|
|
item = str(i) + ".." + str(j) + " \n" |
|
if isinstance(cur_sent.spans[(i, j)], basestring): |
|
item += cur_sent.spans[(i, j)] + "\n" |
|
else: |
|
for rule in cur_sent.spans[(i, j)]: |
|
item += str(rule) + "\n" |
|
if cur_sent.spans[(i, j)] == []: |
|
if j - i < 0: |
|
item = "" |
|
else: |
|
item = "-" |
|
item = TableItem(item.decode("utf-8")) |
|
|
|
|
|
except KeyError: |
|
if j - i < 0: |
|
item = QtGui.QTableWidgetItem("") |
|
else: |
|
item = QtGui.QTableWidgetItem("-") |
|
self.table_widget.setItem(i, j, item) |
|
self.table_widget.setColumnWidth(j, 40) |
|
|
|
|
|
|
|
|
|
self.updateSignal.emit() |
|
self.table_widget.setSortingEnabled(True) |
|
|
|
def update_table(self): |
|
self.table_widget.sortItems(0, QtCore.Qt.DescendingOrder) |
|
|
|
|
|
|
|
|
|
def set_format_syntax(self): |
|
self.format = "syntax" |
|
self.format_drop.setText("Syntax") |
|
self.format_drop.menu().hide() |
|
|
|
def set_format_phrase(self): |
|
self.format = "phrase" |
|
self.format_drop.setText("Phrase") |
|
self.format_drop.menu().hide() |
|
|
|
def set_format_syntaxCube(self): |
|
self.format = "syntaxCube" |
|
self.format_drop.setText("Syntax Cube (-Tall flag)") |
|
self.format_drop.menu().hide() |
|
|
|
def set_format_phraseStackFlag(self): |
|
self.format = "phraseStackFlag" |
|
self.format_drop.setText("Phrase Stack (search-graph)") |
|
self.format_drop.menu().hide() |
|
|
|
def set_format_phraseStackVerbose(self): |
|
self.format = "phraseStackVerbose" |
|
self.format_drop.setText("Phrase Stack (verbose)") |
|
self.format_drop.menu().hide() |
|
|
|
def set_format_syntaxCubeFlag(self): |
|
self.format = "syntaxCubeFlag" |
|
self.format_drop.setText("Syntax Cube (search-graph)") |
|
self.format_drop.menu().hide() |
|
|
|
def set_format_mbot(self): |
|
self.format = "mbot" |
|
self.format_drop.setText("MBOT") |
|
self.format_drop.menu().hide() |
|
|
|
|
|
|
|
|
|
|
|
|
|
def popup(self, r, c): |
|
|
|
|
|
self.w.append(PopUpCell(self.table_widget.item(r, c).text())) |
|
|
|
self.w[-1].show() |
|
|
|
|
|
class HoverTable(QtGui.QTableWidget): |
|
|
|
def __init__(self, parent=None): |
|
super(HoverTable, self).__init__(parent) |
|
self.setMouseTracking(True) |
|
self.horizontalHeader().setClickable(False) |
|
|
|
|
|
|
|
|
|
class PopUpCell(QtGui.QWidget): |
|
def __init__(self, cell_text): |
|
QtGui.QWidget.__init__(self) |
|
layout = QtGui.QHBoxLayout() |
|
text_list = map(lambda x: x, cell_text.split("\n")) |
|
wind_cont = QtGui.QTextEdit() |
|
wind_cont.setReadOnly(True) |
|
wind_cont.setWindowTitle(text_list[0]) |
|
wind_cont.setPlainText(cell_text) |
|
layout.addWidget(wind_cont) |
|
self.setWindowTitle(text_list[0]) |
|
self.setLayout(layout) |
|
self.resize(960, 320) |
|
|
|
|
|
|
|
|
|
|
|
class TableItem(QtGui.QTableWidgetItem): |
|
|
|
def __init__(self, cell_text, type=1000): |
|
super(TableItem, self).__init__(cell_text) |
|
if len(cell_text.split("\n")) > 20: |
|
self.setToolTip("\n".join(cell_text.split("\n")[:19])) |
|
else: |
|
self.setToolTip(cell_text) |
|
self.cell_text = cell_text |
|
|
|
|
|
|