forked from IPKM/nmreval
170 lines
5.8 KiB
Python
170 lines
5.8 KiB
Python
from nmreval.gui_qt.Qt import QtWidgets, QtCore, QtGui
|
|
from nmreval.gui_qt._py.typeconversion import Ui_Dialog
|
|
|
|
|
|
class ConversionDialog(QtWidgets.QDialog, Ui_Dialog):
|
|
convertSets = QtCore.pyqtSignal(list)
|
|
|
|
def __init__(self, parent=None):
|
|
super().__init__(parent=parent)
|
|
self.setupUi(self)
|
|
|
|
self.simple_table.installEventFilter(self)
|
|
self.merge_table.installEventFilter(self)
|
|
|
|
self._simple_table_dropevent = self.simple_table.dropEvent
|
|
self.simple_table.dropEvent = self._drop_on_simple_table
|
|
|
|
self._merge_table_dropevent = self.merge_table.dropEvent
|
|
self.merge_table.dropEvent = self._drop_on_simple_table
|
|
|
|
self.buttonGroup.buttonClicked.connect(self.change_table)
|
|
|
|
def set_graphs(self, graphs: dict):
|
|
self.set_list.clear()
|
|
self.simple_table.clear()
|
|
self.simple_table.setHorizontalHeaderLabels(['Simple', 'Type'])
|
|
self.merge_table.clear()
|
|
self.merge_table.setHorizontalHeaderLabels(['Real', 'Imag', 'Type'])
|
|
|
|
for graph, datasets in graphs.items():
|
|
for set_id, set_name in datasets:
|
|
item_name = set_name + ' (' + graph[1] + ')'
|
|
|
|
item1 = QtWidgets.QListWidgetItem(item_name)
|
|
item1.setData(QtCore.Qt.UserRole, set_id)
|
|
item1.setData(QtCore.Qt.UserRole+1, graph[0])
|
|
self.set_list.addItem(item1)
|
|
|
|
def eventFilter(self, src: QtCore.QObject, evt: QtCore.QEvent):
|
|
if evt.type() in [QtCore.QEvent.DragEnter, QtCore.QEvent.DragMove]:
|
|
evt.accept()
|
|
return True
|
|
|
|
if evt.type() == QtCore.QEvent.KeyPress and evt.key() == QtCore.Qt.Key_Delete:
|
|
if src == self.simple_table:
|
|
type_idx = 1
|
|
else:
|
|
type_idx = 2
|
|
|
|
if len(src.selectedIndexes()) > 0:
|
|
idx = src.selectedIndexes()[0]
|
|
row, col = idx.row(), idx.column()
|
|
|
|
if col != type_idx:
|
|
src.takeItem(row, col)
|
|
is_empty = all(src.item(row, i) is None for i in range(type_idx))
|
|
if is_empty:
|
|
src.removeRow(row)
|
|
|
|
return True
|
|
|
|
return super().eventFilter(src, evt)
|
|
|
|
def _drop_on_simple_table(self, evt: QtGui.QDropEvent):
|
|
"""
|
|
event filter does not receive dropevents?
|
|
"""
|
|
if self.stackedWidget.currentIndex() == 0:
|
|
table = self.simple_table
|
|
type_column = 1
|
|
default_drop = self._simple_table_dropevent
|
|
type_name = ['Points', 'FID', 'Spectrum', 'BDS']
|
|
else:
|
|
table = self.merge_table
|
|
type_column = 2
|
|
default_drop = self._merge_table_dropevent
|
|
type_name = ['FID', 'Spectrum', 'BDS']
|
|
|
|
pos = evt.pos()
|
|
drop_col = table.columnAt(pos.x())
|
|
if drop_col == type_column:
|
|
evt.ignore()
|
|
else:
|
|
drop_row = table.rowAt(pos.y())
|
|
default_drop(evt)
|
|
|
|
if drop_row == -1:
|
|
w = QtWidgets.QComboBox()
|
|
w.addItems(type_name)
|
|
item = QtWidgets.QTableWidgetItem('')
|
|
drop_row = table.rowAt(pos.y())
|
|
table.setItem(drop_row, type_column, item)
|
|
table.setCellWidget(drop_row, type_column, w)
|
|
|
|
item = table.item(drop_row, drop_col)
|
|
idx = table.indexFromItem(item)
|
|
|
|
if idx.row() == -1 and idx.column() == -1:
|
|
item = table.takeItem(drop_row, 0)
|
|
table.setItem(drop_row, drop_col, item)
|
|
|
|
if item is not None:
|
|
item.setToolTip(item.text())
|
|
|
|
table.resizeColumnsToContents()
|
|
|
|
@QtCore.pyqtSlot(QtWidgets.QAbstractButton)
|
|
def change_table(self, button: QtWidgets.QAbstractButton):
|
|
idx = [self.simple_button, self.merge_button].index(button)
|
|
self.stackedWidget.setCurrentIndex(idx)
|
|
|
|
def collect_args(self) -> list:
|
|
src_sets = []
|
|
for row in range(self.simple_table.rowCount()):
|
|
item = self.simple_table.item(row, 0)
|
|
set_id = item.data(QtCore.Qt.UserRole)
|
|
graph_id = item.data(QtCore.Qt.UserRole+1)
|
|
type_idx = self.simple_table.cellWidget(row, 1).currentIndex()
|
|
|
|
src_sets.append((set_id, graph_id, type_idx))
|
|
|
|
for row in range(self.merge_table.rowCount()):
|
|
item = self.merge_table.item(row, 0)
|
|
graph_id = ''
|
|
if item is not None:
|
|
set_id_real = item.data(QtCore.Qt.UserRole)
|
|
graph_id = item.data(QtCore.Qt.UserRole+1)
|
|
else:
|
|
set_id_real = ''
|
|
|
|
item = self.merge_table.item(row, 1)
|
|
if item is not None:
|
|
set_id_imag = item.data(QtCore.Qt.UserRole)
|
|
graph_id = item.data(QtCore.Qt.UserRole+1) if graph_id == '' else graph_id
|
|
else:
|
|
set_id_imag = ''
|
|
type_idx = self.merge_table.cellWidget(row, 2).currentIndex() + 1
|
|
|
|
src_sets.append((set_id_real, set_id_imag, graph_id, type_idx))
|
|
|
|
self.convertSets.emit(src_sets)
|
|
|
|
return src_sets
|
|
|
|
@QtCore.pyqtSlot(QtWidgets.QAbstractButton, name='on_buttonBox_clicked')
|
|
def button_clicked(self, button):
|
|
role = self.buttonBox.buttonRole(button)
|
|
if role == self.buttonBox.RejectRole:
|
|
self.close()
|
|
else:
|
|
self.collect_args()
|
|
self.accept()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
import sys
|
|
from collections import OrderedDict
|
|
|
|
app = QtWidgets.QApplication(sys.argv)
|
|
d = ConversionDialog()
|
|
|
|
data = OrderedDict([
|
|
(('1', 'Graph 0'), [('a', 'Das Sein und das Nichts'), ('b', 'b'), ('c', 'c'), ('d', 'd')]),
|
|
(('2', 'Graph 2'), [('e', 'e'), ('f', 'f'), ('g', 'g'), ('h', 'h')])])
|
|
|
|
d.set_graphs(data)
|
|
d.show()
|
|
|
|
sys.exit(app.exec())
|