nmreval/src/gui_qt/math/evaluation.py

124 lines
4.1 KiB
Python

from ..Qt import QtCore, QtWidgets, QtGui
from .._py.eval_expr_dialog import Ui_CalcDialog
class QEvalDialog(QtWidgets.QDialog, Ui_CalcDialog):
do_eval = QtCore.pyqtSignal(list, list, bool)
do_calc = QtCore.pyqtSignal(list, dict)
def __init__(self, mode='c', parent=None):
super().__init__(parent=parent)
self.setupUi(self)
self.namespace = None
self.success = True
self.set_mode(mode)
self.value_lineEdit.setValidator(QtGui.QDoubleValidator())
def set_mode(self, mode: str):
if mode not in ['c', 'e']:
raise ValueError(f'Mode should be "c" or "e", {mode} given')
if mode == 'c':
self.stackedWidget.setCurrentIndex(1)
else:
self.stackedWidget.setCurrentIndex(0)
self.mode = mode
def set_namespace(self, namespace):
self.namespace = namespace
self.namespace_widget.set_namespace(self.namespace)
def add_data(self, data):
# self.listWidget.clear()
tmp = []
while self.listWidget.count():
tmp.append(self.listWidget.takeItem(0))
for set_id, name in data:
# search if set was used before
new_one = True
for i in range(len(tmp)):
w = tmp[i]
if w.data(QtCore.Qt.UserRole) == set_id:
w.setText(name)
self.listWidget.addItem(w)
tmp.pop(i)
new_one = False
break
# new set, create item
if new_one:
item = QtWidgets.QListWidgetItem(name)
item.setData(QtCore.Qt.UserRole, set_id)
item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEditable)
item.setCheckState(QtCore.Qt.Checked)
self.listWidget.addItem(item)
while len(tmp):
# delete remaining ListWidgetItems
w = tmp.pop()
del w
def set_graphs(self, graphs: list):
self.graph_comboBox.clear()
self.graph_comboBox.addItem('New graph', userData='')
for g_id, g_name in graphs:
self.graph_comboBox.addItem(g_name, userData=g_id)
@QtCore.pyqtSlot(str, name='on_namespace_widget_selected')
def add_to_equation(self, string: str):
self.calc_edit.insertPlainText(string + ' ')
def on_buttonBox_clicked(self, bttn):
bttn_role = self.buttonBox.buttonRole(bttn)
if bttn_role == QtWidgets.QDialogButtonBox.ApplyRole:
self.collect_args()
elif bttn_role == QtWidgets.QDialogButtonBox.AcceptRole:
self.collect_args()
if self.success:
self.accept()
else:
self.reject()
def collect_args(self):
cmds = self.calc_edit.toPlainText().strip().split('\n')
if cmds[-1] == '':
# remove last empty line to check
cmds.pop()
if cmds:
if self.mode == 'e':
set_id = []
for i in range(self.listWidget.count()):
item = self.listWidget.item(i)
if item.checkState() == QtCore.Qt.Checked:
set_id.append(item.data(QtCore.Qt.UserRole))
self.do_eval.emit(cmds, set_id, self.overwrite_checkbox.isChecked())
elif self.mode == 'c':
opts = {
'symbol': self.symbol_comboBox.value,
'symbolcolor': self.symcolor_comboBox.value,
'symbolsize': self.symbol_spinBox.value(),
'linestyle': self.linestyle_comboBox.value,
'linecolor': self.linecolor_comboBox.value,
'linewidth': self.line_doubleSpinBox.value(),
'graph': self.graph_comboBox.currentData(),
'dtype': self.dtype_comboBox.currentIndex(),
'name': self.label_lineEdit.text(),
'val': self.value_lineEdit.text()
}
self.do_calc.emit(cmds, opts)
else:
# keine Ahnung, warum man hier landen sollte ...
self.success = False