keyboard-setting of custom fit range; closes #194; helps for #32
This commit was merged in pull request #219.
This commit is contained in:
+28
-148
@@ -1,138 +1,11 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from nmreval.utils.text import convert
|
||||
|
||||
from ..Qt import QtCore, QtWidgets, QtGui
|
||||
from .._py.fitmodelwidget import Ui_FitParameter
|
||||
from .._py.save_fitmodel_dialog import Ui_SaveDialog
|
||||
from ..lib.iconloading import get_icon
|
||||
from ..lib.tables import TableWidget
|
||||
|
||||
|
||||
class FitModelWidget(QtWidgets.QWidget, Ui_FitParameter):
|
||||
"""
|
||||
Widget to show a global parameter
|
||||
"""
|
||||
|
||||
value_requested = QtCore.pyqtSignal(object)
|
||||
value_changed = QtCore.pyqtSignal(str)
|
||||
state_changed = QtCore.pyqtSignal()
|
||||
replace_single_value = QtCore.pyqtSignal(object)
|
||||
|
||||
def __init__(self, label: str = 'Fitparameter', parent=None, fixed: bool = False):
|
||||
super().__init__(parent)
|
||||
self.setupUi(self)
|
||||
|
||||
self.name = label
|
||||
|
||||
self.parametername.setText(convert(label) + ' ')
|
||||
|
||||
self.parameter_line.setText('1')
|
||||
self.parameter_line.setMaximumWidth(160)
|
||||
self.lineEdit.setMaximumWidth(100)
|
||||
self.lineEdit_2.setMaximumWidth(100)
|
||||
|
||||
self.label_3.setText(f'< {convert(label)} <')
|
||||
|
||||
self.checkBox.stateChanged.connect(self.enableBounds)
|
||||
self.global_checkbox.stateChanged.connect(lambda: self.state_changed.emit())
|
||||
self.parameter_line.editingFinished.connect(self.update_parameter)
|
||||
self.parameter_line.values_requested.connect(lambda: self.value_requested.emit(self))
|
||||
self.parameter_line.replace_single_values.connect(lambda: self.replace_single_value.emit(None))
|
||||
self.parameter_line.editingFinished.connect(lambda: self.value_changed.emit(self.parameter_line.text()))
|
||||
self.fixed_check.toggled.connect(self.set_fixed)
|
||||
|
||||
if fixed:
|
||||
self.fixed_check.hide()
|
||||
|
||||
self.parameter_pos = None
|
||||
self.func_idx = None
|
||||
|
||||
self._linetext = '1'
|
||||
|
||||
self.menu = QtWidgets.QMenu(self)
|
||||
|
||||
def set_parameter_string(self, p: str):
|
||||
self.parameter_line.setText(p)
|
||||
self.parameter_line.setToolTip(p)
|
||||
|
||||
def set_bounds(self, lb: float, ub: float, cbox: bool = True):
|
||||
self.checkBox.setCheckState(QtCore.Qt.Checked if cbox else QtCore.Qt.Unchecked)
|
||||
for val, bds_line in [(lb, self.lineEdit), (ub, self.lineEdit_2)]:
|
||||
if val is not None:
|
||||
bds_line.setText(str(val))
|
||||
else:
|
||||
bds_line.setText('')
|
||||
|
||||
def enableBounds(self, value: int):
|
||||
self.lineEdit.setEnabled(value == 2)
|
||||
self.lineEdit_2.setEnabled(value == 2)
|
||||
|
||||
def set_parameter(self, p: float | None, bds: tuple[float, float, bool] = None,
|
||||
fixed: bool = None, glob: bool = None):
|
||||
ptext = f'{p:.4g}'
|
||||
|
||||
self.set_parameter_string(ptext)
|
||||
|
||||
if bds is not None:
|
||||
self.set_bounds(*bds)
|
||||
|
||||
if fixed is not None:
|
||||
self.fixed_check.setCheckState(QtCore.Qt.CheckState.Unchecked if fixed else QtCore.Qt.CheckState.Checked)
|
||||
|
||||
if glob is not None:
|
||||
self.global_checkbox.setCheckState(QtCore.Qt.CheckState.Checked if glob else QtCore.Qt.CheckState.Unchecked)
|
||||
|
||||
def get_parameter(self):
|
||||
try:
|
||||
p = float(self.parameter_line.text().replace(',', '.'))
|
||||
except ValueError:
|
||||
p = self.parameter_line.text().replace(',', '.')
|
||||
|
||||
if self.checkBox.isChecked():
|
||||
lb_text = self.lineEdit.text()
|
||||
lb = None
|
||||
if lb_text:
|
||||
try:
|
||||
lb = float(lb_text.replace(',', '.'))
|
||||
except ValueError:
|
||||
lb = lb_text
|
||||
|
||||
ub_text = self.lineEdit_2.text()
|
||||
rb = None
|
||||
if ub_text:
|
||||
try:
|
||||
rb = float(ub_text.replace(',', '.'))
|
||||
except ValueError:
|
||||
rb = ub_text
|
||||
else:
|
||||
lb = rb = None
|
||||
|
||||
bounds = (lb, rb)
|
||||
|
||||
return p, bounds, not self.fixed_check.isChecked(), self.global_checkbox.isChecked()
|
||||
|
||||
@QtCore.pyqtSlot(bool)
|
||||
def set_fixed(self, state: bool):
|
||||
# self.global_checkbox.setVisible(not state)
|
||||
self.frame.setVisible(not state)
|
||||
|
||||
@QtCore.pyqtSlot()
|
||||
def update_parameter(self):
|
||||
new_value = self.parameter_line.text()
|
||||
if not new_value:
|
||||
self.parameter_line.setText('1')
|
||||
|
||||
try:
|
||||
float(new_value)
|
||||
is_text = False
|
||||
except ValueError:
|
||||
is_text = True
|
||||
self.global_checkbox.setCheckState(False)
|
||||
|
||||
self.set_fixed(is_text or self.fixed_check.isChecked())
|
||||
|
||||
|
||||
class QSaveModelDialog(QtWidgets.QDialog, Ui_SaveDialog):
|
||||
def __init__(self, types=None, parent=None):
|
||||
super().__init__(parent=parent)
|
||||
@@ -172,30 +45,37 @@ class FitModelTree(QtWidgets.QTreeWidget):
|
||||
treeChanged = QtCore.pyqtSignal()
|
||||
itemRemoved = QtCore.pyqtSignal(int)
|
||||
|
||||
counterRole = QtCore.Qt.UserRole + 1
|
||||
operatorRole = QtCore.Qt.UserRole + 2
|
||||
counterRole = QtCore.Qt.ItemDataRole.UserRole + 1
|
||||
operatorRole = QtCore.Qt.ItemDataRole.UserRole + 2
|
||||
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent=parent)
|
||||
self.setHeaderHidden(True)
|
||||
self.setDragEnabled(True)
|
||||
self.setDragDropMode(QtWidgets.QTreeWidget.InternalMove)
|
||||
self.setDefaultDropAction(QtCore.Qt.MoveAction)
|
||||
self.setDefaultDropAction(QtCore.Qt.DropAction.MoveAction)
|
||||
|
||||
self.itemSelectionChanged.connect(lambda: self.treeChanged.emit())
|
||||
|
||||
def keyPressEvent(self, evt):
|
||||
operators = [QtCore.Qt.Key_Plus, QtCore.Qt.Key_Asterisk,
|
||||
QtCore.Qt.Key_Minus, QtCore.Qt.Key_Slash]
|
||||
operators = [
|
||||
QtCore.Qt.Key.Key_Plus,
|
||||
QtCore.Qt.Key.Key_Asterisk,
|
||||
QtCore.Qt.Key.Key_Minus,
|
||||
QtCore.Qt.Key.Key_Slash
|
||||
]
|
||||
|
||||
if evt.key() == QtCore.Qt.Key_Delete:
|
||||
if evt.key() == QtCore.Qt.Key.Key_Delete:
|
||||
for item in self.selectedItems():
|
||||
self.remove_function(item)
|
||||
|
||||
elif evt.key() == QtCore.Qt.Key_Space:
|
||||
elif evt.key() == QtCore.Qt.Key.Key_Space:
|
||||
for item in self.treeWidget.selectedItems():
|
||||
item.setCheckState(0, QtCore.Qt.Checked) if item.checkState(
|
||||
0) == QtCore.Qt.Unchecked else item.setCheckState(0, QtCore.Qt.Unchecked)
|
||||
cs = item.checkState(0)
|
||||
if cs == QtCore.Qt.CheckState.Unchecked:
|
||||
item.setCheckState(0, QtCore.Qt.CheckState.Checked)
|
||||
else:
|
||||
item.setCheckState(0, QtCore.Qt.CheckState.Unchecked)
|
||||
|
||||
elif evt.key() in operators:
|
||||
idx = operators.index(evt.key())
|
||||
@@ -246,7 +126,7 @@ class FitModelTree(QtWidgets.QTreeWidget):
|
||||
color = QtGui.QColor(color)
|
||||
|
||||
it = QtWidgets.QTreeWidgetItem()
|
||||
it.setData(0, QtCore.Qt.UserRole, idx)
|
||||
it.setData(0, QtCore.Qt.ItemDataRole.UserRole, idx)
|
||||
it.setData(0, self.counterRole, cnt)
|
||||
it.setData(0, self.operatorRole, op)
|
||||
it.setText(0, name)
|
||||
@@ -257,7 +137,7 @@ class FitModelTree(QtWidgets.QTreeWidget):
|
||||
it.setForeground(0, QtGui.QBrush(color))
|
||||
|
||||
it.setIcon(0, get_icon(self.icons[op]))
|
||||
it.setCheckState(0, QtCore.Qt.Checked if active else QtCore.Qt.Unchecked)
|
||||
it.setCheckState(0, QtCore.Qt.CheckState.Checked if active else QtCore.Qt.CheckState.Unchecked)
|
||||
|
||||
if parent is None:
|
||||
self.addTopLevelItem(it)
|
||||
@@ -277,7 +157,7 @@ class FitModelTree(QtWidgets.QTreeWidget):
|
||||
def get_selected(self):
|
||||
try:
|
||||
it = self.selectedItems()[0]
|
||||
function_nr = it.data(0, QtCore.Qt.UserRole)
|
||||
function_nr = it.data(0, QtCore.Qt.ItemDataRole.UserRole)
|
||||
idx = it.data(0, self.counterRole)
|
||||
|
||||
except IndexError:
|
||||
@@ -300,10 +180,10 @@ class FitModelTree(QtWidgets.QTreeWidget):
|
||||
it = parent.child(i)
|
||||
|
||||
child = {
|
||||
'idx': it.data(0, QtCore.Qt.UserRole),
|
||||
'idx': it.data(0, QtCore.Qt.ItemDataRole.UserRole),
|
||||
'op': it.data(0, self.operatorRole),
|
||||
'pos': pos,
|
||||
'active': (it.checkState(0) == QtCore.Qt.Checked),
|
||||
'active': (it.checkState(0) == QtCore.Qt.CheckState.Checked),
|
||||
'children': []
|
||||
}
|
||||
|
||||
@@ -371,8 +251,8 @@ class FitTableWidget(TableWidget):
|
||||
|
||||
for (sid, name) in set_ids:
|
||||
item = QtWidgets.QTableWidgetItem(name)
|
||||
item.setCheckState(QtCore.Qt.Checked)
|
||||
item.setData(QtCore.Qt.UserRole+1, sid)
|
||||
item.setCheckState(QtCore.Qt.CheckState.Checked)
|
||||
item.setData(QtCore.Qt.ItemDataRole.UserRole+1, sid)
|
||||
row = self.rowCount()
|
||||
self.setRowCount(row+1)
|
||||
self.setItem(row, 0, item)
|
||||
@@ -390,15 +270,15 @@ class FitTableWidget(TableWidget):
|
||||
|
||||
for i in range(self.rowCount()):
|
||||
item = self.item(i, 0)
|
||||
if item.checkState() == QtCore.Qt.Checked:
|
||||
if item.checkState() == QtCore.Qt.CheckState.Checked:
|
||||
mod = self.cellWidget(i, 1).currentData()
|
||||
if mod is None:
|
||||
mod = default
|
||||
|
||||
if include_name:
|
||||
arg = (item.data(QtCore.Qt.UserRole+1), item.text())
|
||||
arg = (item.data(QtCore.Qt.ItemDataRole.UserRole+1), item.text())
|
||||
else:
|
||||
arg = item.data(QtCore.Qt.UserRole+1)
|
||||
arg = item.data(QtCore.Qt.ItemDataRole.UserRole+1)
|
||||
|
||||
if mod not in data:
|
||||
data[mod] = []
|
||||
@@ -411,8 +291,8 @@ class FitTableWidget(TableWidget):
|
||||
for i in range(self.rowCount()):
|
||||
item = self.item(i, 0)
|
||||
if include_name:
|
||||
ret_val.append((item.data(QtCore.Qt.UserRole+1), item.text()))
|
||||
ret_val.append((item.data(QtCore.Qt.ItemDataRole.UserRole+1), item.text()))
|
||||
else:
|
||||
ret_val.append(item.data(QtCore.Qt.UserRole+1))
|
||||
ret_val.append(item.data(QtCore.Qt.ItemDataRole.UserRole+1))
|
||||
|
||||
return ret_val
|
||||
|
||||
Reference in New Issue
Block a user