Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 36 additions & 1 deletion lyse/analysis_subprocess.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@

from qtutils.qt import QtCore, QtGui, QtWidgets
from qtutils.qt.QtCore import pyqtSignal as Signal
from qtutils.qt.QtCore import QSettings, QByteArray

from qtutils import inmain, inmain_decorator, UiLoader
import qtutils.icons
Expand Down Expand Up @@ -56,6 +57,9 @@
):
multiprocessing.set_start_method('spawn')

# read labconfig once for plot window locations
autoload_config_file = lyse.utils.LABCONFIG.get('lyse', 'autoload_config_file')
config_dir = os.path.dirname(autoload_config_file)

class PlotWindowCloseEvent(QtGui.QCloseEvent):
def __init__(self, force, *args, **kwargs):
Expand All @@ -68,22 +72,45 @@ class PlotWindow(QtWidgets.QWidget):

def __init__(self, plot, *args, **kwargs):
self.__plot = plot
filepath = kwargs.pop('analysis_filepath')
self.identifier = kwargs.pop('analysis_identifier')
QtWidgets.QWidget.__init__(self, *args, **kwargs)

# configure plot window persistence
filename = os.path.basename(os.path.splitext(filepath)[0])
settings_path = os.path.join(config_dir, 'lyse-'+filename+'.ini')
self.settings = QSettings(settings_path, QSettings.IniFormat)

self.restore_geometry()

def closeEvent(self, event):
self.hide()
if isinstance(event, PlotWindowCloseEvent) and event.force:
# if closing, save window geometry to QSettings
self.settings.setValue(f"windowGeometry-{self.identifier:d}", self.saveGeometry())
self.settings.sync()
self.__plot.on_close()
event.accept()
else:
event.ignore()

def restore_geometry(self):
"""Restores window geometry from local QSettings config.

Will do nothing if config not present.
"""
geometry = self.settings.value(f"windowGeometry-{self.identifier}", QByteArray())
if isinstance(geometry, QByteArray) and not geometry.isEmpty():
self.restoreGeometry(geometry)


class Plot(object):
def __init__(self, figure, identifier, filepath):
self.identifier = identifier
loader = UiLoader()
self.ui = loader.load(os.path.join(lyse.utils.LYSE_DIR, 'user_interface/plot_window.ui'), PlotWindow(self))
self.ui = loader.load(os.path.join(lyse.utils.LYSE_DIR, 'user_interface/plot_window.ui'),
PlotWindow(self, analysis_filepath=filepath,
analysis_identifier=identifier))

self.set_window_title(identifier, filepath)

Expand Down Expand Up @@ -284,6 +311,7 @@ def mainloop(self):
task, data = self.from_parent.get()
with kill_lock:
if task == 'quit':
self.close_plots()
inmain(qapplication.quit)
elif task == 'analyse':
path = data
Expand All @@ -296,6 +324,13 @@ def mainloop(self):
self.to_parent.put(['error', lyse.utils.worker._updated_data])
else:
self.to_parent.put(['error','invalid task %s'%str(task)])

@inmain_decorator()
def close_plots(self):
"""Ensures analysis plots get the force close event and save geometry when lyse closes"""
for plot in self.plots.values():
event = PlotWindowCloseEvent(True)
QtCore.QCoreApplication.instance().postEvent(plot.ui, event)

@inmain_decorator()
def do_analysis(self, path):
Expand Down