1
0
forked from IPKM/nmreval

fix problem with namespaces

This commit is contained in:
Dominik Demuth 2024-09-29 14:33:28 +02:00
parent d07b85ae27
commit f185b24967
5 changed files with 26 additions and 128 deletions

View File

@ -2,136 +2,25 @@ from __future__ import annotations
from pathlib import Path from pathlib import Path
from .usermodeleditor import QUsermodelEditor
from ..Qt import QtWidgets, QtCore, QtGui from ..Qt import QtWidgets, QtCore, QtGui
from .codeeditor import EditorWidget
class QEditor(QtWidgets.QMainWindow): class QEditor(QUsermodelEditor):
runSignal = QtCore.pyqtSignal(str) runSignal = QtCore.pyqtSignal(str)
def __init__(self, path: str | Path = None, parent=None): def __init__(self, path: str | Path = None, parent=None):
super().__init__(parent=parent) super().__init__(path, parent=parent)
self._init_gui() self.add_run_button()
self.fname = None def add_run_button(self):
self._dir = None self.run_button = QtWidgets.QPushButton("Run")
if path is not None: self.centralwidget.layout().addWidget(self.run_button)
self.read_file(path)
def _init_gui(self): self.run_button.clicked.connect(self.start_script)
self.centralwidget = QtWidgets.QWidget(self)
layout = QtWidgets.QVBoxLayout(self.centralwidget)
layout.setContentsMargins(3, 3, 3, 3)
layout.setSpacing(3)
self.edit_field = EditorWidget(self.centralwidget)
font = QtGui.QFont('default')
font.setStyleHint(font.Monospace)
font.setPointSize(10)
self.edit_field.setFont(font)
layout.addWidget(self.edit_field)
self.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(self)
self.setStatusBar(self.statusbar)
self.menubar = self.menuBar()
self.menuFile = QtWidgets.QMenu('File', self.menubar)
self.menubar.addMenu(self.menuFile)
self.menuFile.addAction('Open...', self.open_file, QtGui.QKeySequence.Open)
self.menuFile.addAction('Save', self.overwrite_file, QtGui.QKeySequence.Save)
self.menuFile.addAction('Save as...', self.save_file, QtGui.QKeySequence('Ctrl+Shift+S'))
self.menuFile.addSeparator()
self.menuFile.addAction('Close', self.close, QtGui.QKeySequence.Quit)
self.resize(800, 600)
self.setGeometry(
QtWidgets.QStyle.alignedRect(
QtCore.Qt.LayoutDirection.LeftToRight,
QtCore.Qt.AlignmentFlag.AlignCenter,
self.size(),
QtWidgets.qApp.desktop().availableGeometry()
)
)
def is_modified(self):
return self.edit_field.editor.document().isModified()
def set_modified(self, val: bool):
self.edit_field.editor.document().setModified(val)
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def open_file(self): def start_script(self):
overwrite = self.changes_saved
if overwrite:
fname, _ = QtWidgets.QFileDialog.getOpenFileName(directory=str(self._dir))
if fname:
self.read_file(fname)
def read_file(self, fname: str | Path):
self.set_fname_opts(fname)
if self.fname is not None:
with self.fname.open('r') as f:
self.edit_field.setPlainText(f.read())
def set_fname_opts(self, fname: str | Path):
fname = Path(fname)
if fname.is_file():
self.fname = Path(fname)
self._dir = self.fname.parent
elif fname.is_dir():
self._dir = fname
self.setWindowTitle('Edit ' + str(fname))
def changes_saved(self) -> bool:
if not self.is_modified():
return True
ret = QtWidgets.QMessageBox.question(self, 'Time to think',
'<h4><p>The document was modified.</p>\n'
'<p>Do you want to save changes?</p></h4>',
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No |
QtWidgets.QMessageBox.Cancel)
if ret == QtWidgets.QMessageBox.Yes:
self.save_file()
if ret == QtWidgets.QMessageBox.No:
self.set_modified(False)
return not self.is_modified()
@QtCore.pyqtSlot()
def save_file(self):
outfile, _ = QtWidgets.QFileDialog().getSaveFileName(parent=self, caption='Save file', directory=str(self._dir))
if outfile:
with open(outfile, 'w') as f:
f.write(self.edit_field.toPlainText())
self.set_fname_opts(outfile)
self.set_modified(False)
return self.is_modified()
@QtCore.pyqtSlot()
def overwrite_file(self):
if self.fname is not None:
with self.fname.open('w') as f:
f.write(self.edit_field.toPlainText())
self.modelsChanged.emit()
self.set_modified(False)
def closeEvent(self, evt: QtGui.QCloseEvent):
self.runSignal.emit(self.edit_field.toPlainText()) self.runSignal.emit(self.edit_field.toPlainText())
super().closeEvent(evt)

View File

@ -77,13 +77,19 @@ class QUsermodelEditor(QtWidgets.QMainWindow):
def read_file(self, fname: str | Path): def read_file(self, fname: str | Path):
self.set_fname_opts(fname) self.set_fname_opts(fname)
with self.fname.open('r') as f: if self.fname is not None:
self.edit_field.setPlainText(f.read()) with self.fname.open('r') as f:
self.edit_field.setPlainText(f.read())
def set_fname_opts(self, fname: str | Path): def set_fname_opts(self, fname: str | Path):
self.fname = Path(fname) fname = Path(fname)
self._dir = self.fname.parent if fname.is_file():
self.setWindowTitle('Edit ' + str(fname)) self.fname = Path(fname)
self._dir = self.fname.parent
self.setWindowTitle('Edit ' + str(fname))
elif fname.is_dir():
self._dir = fname
def changes_saved(self) -> bool: def changes_saved(self) -> bool:
if not self.is_modified(): if not self.is_modified():

View File

@ -88,7 +88,6 @@ class QFCReader(QtWidgets.QDialog, Ui_FCEval_dialog):
def accept(self): def accept(self):
items = [self.listWidget.item(i).text() for i in range(self.listWidget.count())] items = [self.listWidget.item(i).text() for i in range(self.listWidget.count())]
print(items)
if items: if items:
with busy_cursor(): with busy_cursor():
self.read(items) self.read(items)

View File

@ -4,6 +4,8 @@ from collections import namedtuple
import numpy as np import numpy as np
import nmreval
from nmreval import models from nmreval import models
from nmreval.configs import config_paths from nmreval.configs import config_paths
from nmreval.lib.importer import find_models, import_ from nmreval.lib.importer import find_models, import_
@ -28,6 +30,7 @@ class Namespace:
'y_err': (None, 'y error values'), 'y_err': (None, 'y error values'),
'fit': (None, 'dictionary of fit parameter', 'fit["PIKA"]'), 'fit': (None, 'dictionary of fit parameter', 'fit["PIKA"]'),
'np': (np, 'numpy module'), 'np': (np, 'numpy module'),
'nmreval': (nmreval, 'built-in classes and stuff')
}, },
parents=('Basic', 'General'), parents=('Basic', 'General'),
) )

View File

@ -1033,7 +1033,7 @@ class UpperManagement(QtCore.QObject):
else: else:
data = self.data[sets[0]] data = self.data[sets[0]]
if isinstance(data.data, new_type): if isinstance(data.data, new_type):
error_list.append(f'{data.name} is alreade of type {new_type.__name__}') error_list.append(f'{data.name} is already of type {new_type.__name__}')
continue continue
new_data = new_type(data.x, np.zeros(data.x.size)) new_data = new_type(data.x, np.zeros(data.x.size))
@ -1114,7 +1114,8 @@ class UpperManagement(QtCore.QObject):
ns = self.namespace.flatten() ns = self.namespace.flatten()
ns['return_list'] = [] ns['return_list'] = []
exec(text, globals(), ns) # custom namespace must be available in global namespace of exec, otherwise imports do not work in functions
exec(text, ns, ns)
new_sets = [] new_sets = []
for new_data in ns['return_list']: for new_data in ns['return_list']: