From f185b2496734e926f4ca3f1b6cd01b034f8fb144 Mon Sep 17 00:00:00 2001 From: Dominik Demuth Date: Sun, 29 Sep 2024 14:33:28 +0200 Subject: [PATCH] fix problem with namespaces --- src/gui_qt/editors/script_editor.py | 129 ++------------------------ src/gui_qt/editors/usermodeleditor.py | 16 +++- src/gui_qt/io/fcbatchreader.py | 1 - src/gui_qt/lib/namespace.py | 3 + src/gui_qt/main/management.py | 5 +- 5 files changed, 26 insertions(+), 128 deletions(-) diff --git a/src/gui_qt/editors/script_editor.py b/src/gui_qt/editors/script_editor.py index 4bf4dd9..57d26d7 100644 --- a/src/gui_qt/editors/script_editor.py +++ b/src/gui_qt/editors/script_editor.py @@ -2,136 +2,25 @@ from __future__ import annotations from pathlib import Path +from .usermodeleditor import QUsermodelEditor from ..Qt import QtWidgets, QtCore, QtGui -from .codeeditor import EditorWidget -class QEditor(QtWidgets.QMainWindow): +class QEditor(QUsermodelEditor): runSignal = QtCore.pyqtSignal(str) 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 - self._dir = None - if path is not None: - self.read_file(path) + def add_run_button(self): + self.run_button = QtWidgets.QPushButton("Run") + self.centralwidget.layout().addWidget(self.run_button) - def _init_gui(self): - 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) + self.run_button.clicked.connect(self.start_script) @QtCore.pyqtSlot() - def open_file(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', - '

The document was modified.

\n' - '

Do you want to save changes?

', - 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): + def start_script(self): self.runSignal.emit(self.edit_field.toPlainText()) - super().closeEvent(evt) diff --git a/src/gui_qt/editors/usermodeleditor.py b/src/gui_qt/editors/usermodeleditor.py index e912aa0..3cc1dbc 100644 --- a/src/gui_qt/editors/usermodeleditor.py +++ b/src/gui_qt/editors/usermodeleditor.py @@ -77,13 +77,19 @@ class QUsermodelEditor(QtWidgets.QMainWindow): def read_file(self, fname: str | Path): self.set_fname_opts(fname) - with self.fname.open('r') as f: - self.edit_field.setPlainText(f.read()) + 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): - self.fname = Path(fname) - self._dir = self.fname.parent - self.setWindowTitle('Edit ' + str(fname)) + fname = Path(fname) + if fname.is_file(): + 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: if not self.is_modified(): diff --git a/src/gui_qt/io/fcbatchreader.py b/src/gui_qt/io/fcbatchreader.py index a4444e6..c62acb2 100644 --- a/src/gui_qt/io/fcbatchreader.py +++ b/src/gui_qt/io/fcbatchreader.py @@ -88,7 +88,6 @@ class QFCReader(QtWidgets.QDialog, Ui_FCEval_dialog): def accept(self): items = [self.listWidget.item(i).text() for i in range(self.listWidget.count())] - print(items) if items: with busy_cursor(): self.read(items) diff --git a/src/gui_qt/lib/namespace.py b/src/gui_qt/lib/namespace.py index ae783ba..e164cd3 100644 --- a/src/gui_qt/lib/namespace.py +++ b/src/gui_qt/lib/namespace.py @@ -4,6 +4,8 @@ from collections import namedtuple import numpy as np +import nmreval + from nmreval import models from nmreval.configs import config_paths from nmreval.lib.importer import find_models, import_ @@ -28,6 +30,7 @@ class Namespace: 'y_err': (None, 'y error values'), 'fit': (None, 'dictionary of fit parameter', 'fit["PIKA"]'), 'np': (np, 'numpy module'), + 'nmreval': (nmreval, 'built-in classes and stuff') }, parents=('Basic', 'General'), ) diff --git a/src/gui_qt/main/management.py b/src/gui_qt/main/management.py index ef2022d..31553e3 100644 --- a/src/gui_qt/main/management.py +++ b/src/gui_qt/main/management.py @@ -1033,7 +1033,7 @@ class UpperManagement(QtCore.QObject): else: data = self.data[sets[0]] 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 new_data = new_type(data.x, np.zeros(data.x.size)) @@ -1114,7 +1114,8 @@ class UpperManagement(QtCore.QObject): ns = self.namespace.flatten() 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 = [] for new_data in ns['return_list']: