more_bugs (#51)

closes #46, #47, #7

Co-authored-by: Dominik Demuth <dominik.demuth@physik.tu-darmstadt.de>
Reviewed-on: #51
This commit is contained in:
2023-04-16 15:40:58 +00:00
parent bb3d5ac58b
commit 59625c1581
6 changed files with 142 additions and 57 deletions

View File

@ -2,7 +2,6 @@ from __future__ import annotations
import datetime
import os
import pathlib
import re
from pathlib import Path
@ -115,7 +114,10 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
self.mousepos = QtWidgets.QLabel('')
self.status = QtWidgets.QLabel('')
# noinspection PyUnresolvedReferences
self.statusBar.addWidget(self.status)
# noinspection PyUnresolvedReferences
self.statusBar.addWidget(self.mousepos)
self.fitregion = RegionItem()
@ -151,8 +153,6 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
self.actionUndo.setIcon(icon)
self.menuData.insertAction(self.actionRedo, self.actionUndo)
# self.actionSave.triggered.connect(lambda: self.management.save('/autohome/dominik/nmreval/testdata/test.nmr', ''))
# self.actionSave.triggered.connect(self.save)
self.action_save_fit_parameter.triggered.connect(self.save_fit_parameter)
self.ac_group2.triggered.connect(self.change_fit_limits)
@ -165,6 +165,12 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
self.action_new_set.triggered.connect(self.management.create_empty)
self.actionDelete_window.triggered.connect(self.management.delete_sets)
self.actionCascade_windows.triggered.connect(self.area.cascadeSubWindows)
self.actionTile.triggered.connect(self.area.tileSubWindows)
self.actionTileHorizontal.triggered.connect(self.area.tileSubWindowsHorizontally)
self.actionTileVertical.triggered.connect(self.area.tileSubWindowsVertically)
self.datawidget.keyChanged.connect(self.management.change_keys)
self.datawidget.tree.deleteItem.connect(self.management.delete_sets)
self.datawidget.tree.moveItem.connect(self.management.move_sets)
@ -178,7 +184,8 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
self.datawidget.tree.saveFits.connect(self.save_fit_parameter)
self.datawidget.tree.extendFits.connect(self.extend_fit)
self.management.newData.connect(self.show_new_data)
self.management.newData[list, str].connect(self.show_new_data)
self.management.newData[list, str, bool].connect(self.show_new_data)
self.management.newGraph.connect(self.new_graph)
self.management.dataChanged.connect(self.update_data)
self.management.deleteData.connect(self.delete_data)
@ -191,13 +198,14 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
self.fit_dialog._management = self.management
self.fit_dialog.preview_emit.connect(self.show_fit_preview)
self.fit_dialog.fitStartSig.connect(self.start_fit)
self.fit_dialog.abortFit.connect(lambda : self.management.stopFit.emit())
self.fit_dialog.abortFit.connect(lambda: self.management.stopFit.emit())
self.movedialog.moveData.connect(self.move_sets)
self.movedialog.copyData.connect(self.management.copy_sets)
self.ptsselectwidget.points_selected.connect(self.management.extract_points)
self.t1tauwidget.newData.connect(self.management.add_new_data)
self.t1tauwidget.newData.connect(self.management.add_new_data)
self.editsignalwidget.do_something.connect(self.management.apply)
@ -279,7 +287,7 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
use_underscore = save_dialog.checkBox.isChecked()
self.management.save(savefile, selected_filter, strip_spaces=use_underscore)
param_outfile = re.sub('[_\s-]?<label>[_\s-]?', '', savefile.stem)
param_outfile = re.sub(r'[_\s-]?<label>[_\s-]?', '', savefile.stem)
bad_character = r'/*<>\|:"'
for c in bad_character:
@ -321,10 +329,15 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
return w.id
@QtCore.pyqtSlot(list, str)
def show_new_data(self, sets: list, graph: str):
@QtCore.pyqtSlot(list, str, bool)
def show_new_data(self, sets: list, graph: str, skip_change: bool = False):
if len(sets) == 0:
return
prev_graph = ''
if skip_change:
prev_graph = self.management.current_graph
if graph == '':
graph = self.new_graph()
@ -336,16 +349,14 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
self.datawidget.add_item(new_item.id, new_item.name, graph)
self.datawidget.blockSignals(False)
if graph == self.fit_dialog.connected_figure:
self.fit_dialog.load(self.management.graphs.active(graph))
# if graph == self.fit_dialog.connected_figure:
# self.fit_dialog.load(self.management.graphs.active(graph))
if skip_change:
self.area.setActiveSubWidget(prev_graph)
if self.valuewidget.isVisible():
self.valuewidget(self.management.graphs.tree())
@QtCore.pyqtSlot(name='on_actionDelete_window_triggered')
def delete_windows(self):
self.management.delete_sets()
@QtCore.pyqtSlot(str)
def remove_graph(self, gid: str):
self.datawidget.remove_item([gid])
@ -389,7 +400,6 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
break
if w is not None:
self.area.removeSubWindow(w)
w.close()
@ -419,7 +429,7 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
self.datawidget.blockSignals(False)
w.mousePositionChanged.connect(self.mousemoved)
w.aboutToClose.connect(self.delete_windows)
w.aboutToClose.connect(self.management.delete_sets)
w.positionClicked.connect(self.point_selected)
w.show()
@ -430,42 +440,36 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
@QtCore.pyqtSlot(QtWidgets.QMdiSubWindow, name='on_area_subWindowActivated')
def change_window(self, wd):
""" Called every time focus moves from or to a subwindow. Returns None if current focus is not on a subwindow"""
if wd is not None:
if self.current_graph_widget is not None:
self.current_graph_widget.closable = True
if wd is None:
return
if self.ptsselectwidget.isVisible():
self._select_ptswidget(False, False, False)
if self.current_graph_widget is not None:
self.current_graph_widget.closable = True
if self.fit_dialog.isVisible():
self._select_fitwidget(False, False)
self.current_graph_widget = wd.widget()
self.management.current_graph = wd.widget().id
self.current_plotitem = self.current_graph_widget.graphic
self.change_mouse_mode(self.actionMouse_behaviour.isChecked())
pick = False
block = False
if self.ptsselectwidget.isVisible():
pick, block = self._select_ptswidget(True, pick, block)
self._select_ptswidget(False, False, False)
if self.fit_dialog.isVisible():
block = self._select_fitwidget(True, block)
self._select_fitwidget(False, False)
self._set_pick_block(pick, block)
self.current_graph_widget = wd.widget()
self.management.current_graph = wd.widget().id
self.current_plotitem = self.current_graph_widget.graphic
self.datawidget.tree.blockSignals(True)
self.datawidget.tree.highlight(self.management.current_graph)
self.datawidget.tree.blockSignals(False)
self.change_mouse_mode(self.actionMouse_behaviour.isChecked())
@QtCore.pyqtSlot(name='on_actionCascade_windows_triggered')
@QtCore.pyqtSlot(name='on_actionTile_triggered')
def change_window_size(self):
if self.sender() == self.actionCascade_windows:
self.area.cascadeSubWindows()
elif self.sender() == self.actionTile:
self.area.tileSubWindows()
pick = False
block = False
if self.ptsselectwidget.isVisible():
pick, block = self._select_ptswidget(True, pick, block)
if self.fit_dialog.isVisible():
block = self._select_fitwidget(True, block)
self._set_pick_block(pick, block)
self.datawidget.tree.blockSignals(True)
self.datawidget.tree.highlight(self.management.current_graph)
self.datawidget.tree.blockSignals(False)
@QtCore.pyqtSlot(name='on_actionChange_datatypes_triggered')
def type_change_dialog(self):
@ -558,8 +562,9 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
self.management.graphs[current_graph].add_external(self.valuewidget.selection_imag)
else:
if self.valuewidget.connected_figure is not None:
self.management.graphs[self.valuewidget.connected_figure].remove_external(self.valuewidget.selection_real)
self.management.graphs[self.valuewidget.connected_figure].remove_external(self.valuewidget.selection_imag)
conn_fig = self.valuewidget.connected_figure
self.management.graphs[conn_fig].remove_external(self.valuewidget.selection_real)
self.management.graphs[conn_fig].remove_external(self.valuewidget.selection_imag)
def _select_integralwidget(self, onoff: bool, pick_required: bool, block_window: bool) -> tuple[bool, bool]:
if self.current_graph_widget is None:
@ -623,7 +628,8 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
@QtCore.pyqtSlot(str)
def get_data(self, key: str):
self.sender().set_data(self.management[key])
if hasattr(self.sender(), 'set_data'):
self.sender().set_data(self.management[key])
@QtCore.pyqtSlot(name='on_actionCalculateT1_triggered')
def show_t1calc_dialog(self):
@ -832,6 +838,7 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
except KeyError:
ret_val = None
# noinspection PyUnresolvedReferences
self.sender().receive_data(ret_val)
return ret_val
@ -847,7 +854,7 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
self.t1tauwidget.t1min_picked(pos)
elif w == self.integralwidget:
region, integral_plot = self.integralwidget.add(pos)
region, integral_plot = self.integralwidget.add(pos)
self.current_graph_widget.add_external(region)
self.current_graph_widget.add_external(integral_plot)
@ -928,7 +935,8 @@ class NMRMainWindow(QtWidgets.QMainWindow, Ui_BaseWindow):
res_dialog.show()
@QtCore.pyqtSlot(dict, list, str, bool, bool, list)
def accepts_fit(self, res: dict, opts: list, param_graph: str, show_fit: bool, parts: bool, extrapolate: list) -> None:
def accepts_fit(self, res: dict, opts: list, param_graph: str,
show_fit: bool, parts: bool, extrapolate: list) -> None:
self.fit_dialog.set_parameter(res)
self.management.make_fits(res, opts, param_graph, show_fit, parts, extrapolate)

View File

@ -74,7 +74,7 @@ class UpperManagement(QtCore.QObject):
newGraph = QtCore.pyqtSignal()
restoreGraph = QtCore.pyqtSignal(str)
deleteGraph = QtCore.pyqtSignal(str)
newData = QtCore.pyqtSignal(list, str)
newData = QtCore.pyqtSignal([list, str], [list, str, bool])
deleteData = QtCore.pyqtSignal(list)
dataChanged = QtCore.pyqtSignal(str)
fitFinished = QtCore.pyqtSignal(list)
@ -287,6 +287,7 @@ class UpperManagement(QtCore.QObject):
@QtCore.pyqtSlot(list)
@QtCore.pyqtSlot(str)
@QtCore.pyqtSlot()
def delete_sets(self, rm_sets: list = None):
rm_graphs = []
@ -624,8 +625,7 @@ class UpperManagement(QtCore.QObject):
if not graph_id:
graph_id = ''
# TODO add flag that new window will not get focus, because it messes up the data_table in fitwindow
self.newData.emit(p_id_list, graph_id)
self.newData[list, str, bool].emit(p_id_list, graph_id, True)
def save_fit_parameter(self, fname: str | pathlib.Path, fit_sets: list[str] = None):
if fit_sets is None: