From 6063707babfd3fee8fad049784b60dc0aaa2da3c Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Thu, 14 Nov 2024 07:22:07 +0100 Subject: [PATCH 01/16] report to summary --- .../EasyReflectometryApp/Backends/Py/py_backend.py | 12 ++++++------ .../Backends/Py/{report.py => summary.py} | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) rename src_qt6/EasyReflectometryApp/Backends/Py/{report.py => summary.py} (99%) diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py index c2724b4d..a3952988 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py @@ -10,7 +10,7 @@ from .project import Project from .sample import Sample from .status import Status -from .report import Report +from .summary import Summary class PyBackend(QObject): @@ -26,7 +26,7 @@ def __init__(self, parent=None): self._sample = Sample(self._project_lib) self._experiment = Experiment(self._project_lib) self._analysis = Analysis(self._project_lib) - self._report = Report(self._project_lib) + self._summary = Summary(self._project_lib) self._status = Status(self._project_lib) # Plotting backend part @@ -60,8 +60,8 @@ def analysis(self) -> Analysis: return self._analysis @Property('QVariant', constant=True) - def report(self) -> Report: - return self._report + def summary(self) -> Summary: + return self._summary # Other elements @Property('QVariant', constant=True) @@ -96,10 +96,10 @@ def _connect_example_page(self) -> None: def _relay_project_page_name(self): self._status.projectChanged.emit() - self._report.asHtmlChanged.emit() + self._summary.asHtmlChanged.emit() def _relay_project_page_created(self): - self._report.createdChanged.emit() + self._summary.createdChanged.emit() def _relay_sample_page_models_index(self, index: int): self._plotting.setModelIndex(index) diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/report.py b/src_qt6/EasyReflectometryApp/Backends/Py/summary.py similarity index 99% rename from src_qt6/EasyReflectometryApp/Backends/Py/report.py rename to src_qt6/EasyReflectometryApp/Backends/Py/summary.py index 72be6037..1aa257b4 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/report.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/summary.py @@ -78,7 +78,7 @@ """ -class Report(QObject): +class Summary(QObject): createdChanged = Signal() asHtmlChanged = Signal() From 19986fbba134169900bd19297a493c199efa227a Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Thu, 14 Nov 2024 09:55:58 +0100 Subject: [PATCH 02/16] summary skeleton --- .../Backends/Mock/Helpers.qml | 10 +++++ .../Backends/Mock/{Report.qml => Summary.qml} | 13 +++++- .../EasyReflectometryApp/Backends/Mock/qmldir | 3 +- .../Backends/MockBackend.qml | 3 +- .../Backends/Py/helpers.py | 43 ++++++++++++------- .../Backends/Py/py_backend.py | 7 +++ .../Gui/ApplicationWindow.qml | 4 +- .../Gui/Globals/BackendWrapper.qml | 17 +++++++- .../Gui/Pages/{Report => Summary}/Layout.qml | 8 ++-- .../MainContent/Summary.qml | 0 .../Sidebar/Basic/Groups/Export.qml | 31 ++++++++----- .../Sidebar/Basic/Layout.qml | 2 +- .../Sidebar/Extra/Groups/Empty.qml | 0 .../Sidebar/Extra/Layout.qml | 0 14 files changed, 102 insertions(+), 39 deletions(-) create mode 100644 src_qt6/EasyReflectometryApp/Backends/Mock/Helpers.qml rename src_qt6/EasyReflectometryApp/Backends/Mock/{Report.qml => Summary.qml} (84%) rename src_qt6/EasyReflectometryApp/Gui/Pages/{Report => Summary}/Layout.qml (86%) rename src_qt6/EasyReflectometryApp/Gui/Pages/{Report => Summary}/MainContent/Summary.qml (100%) rename src_qt6/EasyReflectometryApp/Gui/Pages/{Report => Summary}/Sidebar/Basic/Groups/Export.qml (79%) rename src_qt6/EasyReflectometryApp/Gui/Pages/{Report => Summary}/Sidebar/Basic/Layout.qml (90%) rename src_qt6/EasyReflectometryApp/Gui/Pages/{Report => Summary}/Sidebar/Extra/Groups/Empty.qml (100%) rename src_qt6/EasyReflectometryApp/Gui/Pages/{Report => Summary}/Sidebar/Extra/Layout.qml (100%) diff --git a/src_qt6/EasyReflectometryApp/Backends/Mock/Helpers.qml b/src_qt6/EasyReflectometryApp/Backends/Mock/Helpers.qml new file mode 100644 index 00000000..91e9dc33 --- /dev/null +++ b/src_qt6/EasyReflectometryApp/Backends/Mock/Helpers.qml @@ -0,0 +1,10 @@ +pragma Singleton + +import QtQuick + +QtObject { + function localFileToUrl(value) { + console.debug(`localFileToUrl ${value}`) + return `Url ${value}` + } +} \ No newline at end of file diff --git a/src_qt6/EasyReflectometryApp/Backends/Mock/Report.qml b/src_qt6/EasyReflectometryApp/Backends/Mock/Summary.qml similarity index 84% rename from src_qt6/EasyReflectometryApp/Backends/Mock/Report.qml rename to src_qt6/EasyReflectometryApp/Backends/Mock/Summary.qml index 11b08a1f..2ae7464c 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Mock/Report.qml +++ b/src_qt6/EasyReflectometryApp/Backends/Mock/Summary.qml @@ -3,7 +3,9 @@ pragma Singleton import QtQuick QtObject { - property bool created: true + readonly property bool created: true + + readonly property var exportFormats: ["HTML", "PDF"] readonly property string asHtml: ' @@ -74,5 +76,14 @@ th, td { padding-right: 18px; } ' + function saveAsHtml() { + console.debug(`Saving HTML summary`) + } + + function saveAsPdf() { + console.debug(`Saving PDF summary`) + } + + } diff --git a/src_qt6/EasyReflectometryApp/Backends/Mock/qmldir b/src_qt6/EasyReflectometryApp/Backends/Mock/qmldir index b0b8eaa3..cbf8be7e 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Mock/qmldir +++ b/src_qt6/EasyReflectometryApp/Backends/Mock/qmldir @@ -4,7 +4,8 @@ singleton Analysis Analysis.qml singleton Experiment Experiment.qml singleton Home Home.qml singleton Project Project.qml -singleton Report Report.qml +singleton Summary Summary.qml singleton Sample Sample.qml singleton Status Status.qml singleton Plotting Plotting.qml +singleton Helpers Helpers.qml diff --git a/src_qt6/EasyReflectometryApp/Backends/MockBackend.qml b/src_qt6/EasyReflectometryApp/Backends/MockBackend.qml index 0a19523b..c80ee8ec 100644 --- a/src_qt6/EasyReflectometryApp/Backends/MockBackend.qml +++ b/src_qt6/EasyReflectometryApp/Backends/MockBackend.qml @@ -10,10 +10,11 @@ QtObject { property var experiment: Backend.Experiment property var home: Backend.Home property var project: Backend.Project - property var report: Backend.Report + property var summary: Backend.Summary property var sample: Backend.Sample property var status: Backend.Status property var plotting: Backend.Plotting + property var helpers: Backend.Helpers } diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/helpers.py b/src_qt6/EasyReflectometryApp/Backends/Py/helpers.py index 7534c896..5713c7bd 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/helpers.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/helpers.py @@ -2,10 +2,21 @@ from uncertainties import ufloat from PySide6.QtWidgets import QApplication +from PySide6.QtCore import QUrl +from PySide6.QtCore import Slot + + +class GUI: + @Slot(str, result=str) + @staticmethod + def localFileToUrl(fpath: str): + url = QUrl.fromLocalFile(fpath).toString() + return url class IO: + @staticmethod def generalizePath(fpath: str) -> str: """ @@ -62,24 +73,24 @@ def toStdDevSmalestPrecision_OLD(value, std_dev): value_with_std_dev_str = f'{ufloat(value, std_dev):{fmt}S}' return value_str, std_dev_str, value_with_std_dev_str - def value_with_error_WEB(val, err, precision=2): - """String with value and error in parenthesis with the number of digits given by precision.""" - # Number of digits in the error - err_decimals = precision - int(np.floor(np.log10(err) + 1)) - # Output error with a "precision" number of significant digits - err_out = round(err, err_decimals) - # Removes leading zeros for fractional errors - if err_out < 1: - err_out = int(round(err_out * 10**err_decimals)) - err_format = 0 - else: - err_format = int(np.clip(err_decimals, 0, np.inf)) + # def value_with_error_WEB(val, err, precision=2): + # """String with value and error in parenthesis with the number of digits given by precision.""" + # # Number of digits in the error + # err_decimals = precision - int(np.floor(np.log10(err) + 1)) + # # Output error with a "precision" number of significant digits + # err_out = round(err, err_decimals) + # # Removes leading zeros for fractional errors + # if err_out < 1: + # err_out = int(round(err_out * 10**err_decimals)) + # err_format = 0 + # else: + # err_format = int(np.clip(err_decimals, 0, np.inf)) - # Format the value to have the same significant digits as the error - val_out = round(val, err_decimals) - val_format = int(np.clip(err_decimals, 0, np.inf)) + # # Format the value to have the same significant digits as the error + # val_out = round(val, err_decimals) + # val_format = int(np.clip(err_decimals, 0, np.inf)) - return f'{val_out:.{val_format}f}({err_out:.{err_format}f})' + # return f'{val_out:.{val_format}f}({err_out:.{err_format}f})' class Application(QApplication): # QGuiApplication crashes when using in combination with QtCharts diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py index a3952988..f4935f55 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py @@ -11,6 +11,7 @@ from .sample import Sample from .status import Status from .summary import Summary +from .helpers import GUI as GUI_Helpers class PyBackend(QObject): @@ -32,6 +33,8 @@ def __init__(self, parent=None): # Plotting backend part self._plotting = Plotting1d(self._project_lib) + self._gui_helpers = GUI_Helpers() + self._logger = LoggerLevelHandler(self) # Must be last to ensure all backend parts are created @@ -76,6 +79,10 @@ def plotting(self) -> Plotting1d: def logger(self): return self._logger + @Property('QVariant', constant=True) + def helpers(self): + return self._gui_helpers + ######### Connections to relay info between the backend parts def _connect_backend_parts(self) -> None: self._connect_project_page() diff --git a/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml b/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml index da90aea5..a22a9e17 100644 --- a/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml +++ b/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml @@ -127,7 +127,7 @@ EaComponents.ApplicationWindow { // Summary page EaElements.AppBarTabButton { id: summaryButton - enabled: false + enabled: true fontIcon: "clipboard-list" text: qsTr("Summary") ToolTip.text: qsTr("Summary of the work done") @@ -149,7 +149,7 @@ EaComponents.ApplicationWindow { Loader { source: 'Pages/Sample/Layout.qml' }, Loader { source: 'Pages/Experiment/Layout.qml' }, // Loader { source: 'Pages/Analysis/Layout.qml' }, - Loader { source: 'Pages/Report/Layout.qml' } + Loader { source: 'Pages/Summary/Layout.qml' } ] ///////////// diff --git a/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml b/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml index 298e7f10..448c4118 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml @@ -167,6 +167,7 @@ QtObject { function experimentLoad(value) { activeBackend.experiment.load(value) } + /////////////// // Analysis page /////////////// @@ -176,8 +177,13 @@ QtObject { /////////////// // Summary page /////////////// - readonly property bool summaryCreated: activeBackend.report.created - readonly property string summaryAsHtml: activeBackend.report.asHtml + readonly property bool summaryCreated: activeBackend.summary.created + readonly property string summaryAsHtml: activeBackend.summary.asHtml + readonly property var summaryExportFormats: activeBackend.summary.exportFormats + + function summarySaveAsHtml() { activeBackend.summary.saveAsHtml() } + function summarySaveAsPdf() { activeBackend.summary.saveAsPdf() } + /////////////// // Plotting @@ -198,4 +204,11 @@ QtObject { readonly property var plottingExperimentMaxY: activeBackend.plotting.sampleMaxY function plottingSetQtChartsSerieRef(value1, value2, value3) { activeBackend.plotting.setQtChartsSerieRef(value1, value2, value3) } + + + /////////////// + // Helpers + /////////////// + + function helpersLocalFileToUrl(value) { return activeBackend.helpers.localFileToUrl(value) } } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Report/Layout.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Layout.qml similarity index 86% rename from src_qt6/EasyReflectometryApp/Gui/Pages/Report/Layout.qml rename to src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Layout.qml index bcd1da83..223ccffa 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Report/Layout.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Layout.qml @@ -31,13 +31,13 @@ EaComponents.ContentPage { sideBar: EaComponents.SideBar { tabs: [ - EaElements.TabButton { text: qsTr('Basic controls') }, - EaElements.TabButton { text: qsTr('Extra controls') } + EaElements.TabButton { text: qsTr('Basic controls') } +// EaElements.TabButton { text: qsTr('Extra controls') } ] items: [ - Loader { source: 'Sidebar/Basic/Layout.qml' }, - Loader { source: 'Sidebar/Extra/Layout.qml' } + Loader { source: 'Sidebar/Basic/Layout.qml' } +// Loader { source: 'Sidebar/Extra/Layout.qml' } ] continueButton.visible: false diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Report/MainContent/Summary.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/MainContent/Summary.qml similarity index 100% rename from src_qt6/EasyReflectometryApp/Gui/Pages/Report/MainContent/Summary.qml rename to src_qt6/EasyReflectometryApp/Gui/Pages/Summary/MainContent/Summary.qml diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Report/Sidebar/Basic/Groups/Export.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Sidebar/Basic/Groups/Export.qml similarity index 79% rename from src_qt6/EasyReflectometryApp/Gui/Pages/Report/Sidebar/Basic/Groups/Export.qml rename to src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Sidebar/Basic/Groups/Export.qml index 9b4177d8..f8dd2922 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Report/Sidebar/Basic/Groups/Export.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Sidebar/Basic/Groups/Export.qml @@ -8,7 +8,6 @@ import QtQuick.Dialogs import QtCore import EasyApp.Gui.Style as EaStyle -import EasyApp.Gui.Globals as EaGlobals import EasyApp.Gui.Elements as EaElements import EasyApp.Gui.Logic as EaLogic @@ -41,19 +40,14 @@ Column { text: qsTr('Name') } } - // Name field - // Format selector EaElements.ComboBox { id: formatField topInset: formatLabel.height topPadding: topInset + padding width: EaStyle.Sizes.fontPixelSize * 10 - textRole: 'text' - valueRole: 'value' - model: [ - { value: 'html', text: qsTr('HTML') } - ] + model: Globals.BackendWrapper.summaryExportFormats// [ + EaElements.Label { id: formatLabel text: qsTr('Format') @@ -86,10 +80,9 @@ Column { showBackground: false fontIcon: 'folder-open' ToolTip.text: qsTr('Choose report parent directory') - onClicked: reportParentDirDialog.open() + onClicked: summaryParentDirDialog.open() } } - // Location field // Save button EaElements.SideBarButton { @@ -97,7 +90,23 @@ Column { wide: true fontIcon: 'download' text: qsTr('Save') + onClicked: { + if (formatField.currentValue === 'HTML') { + Globals.BackendWrapper.summarySaveAsHtml() + } else if (formatField.currentValue === 'PDF') { + Globals.BackendWrapper.summarySaveAsPdf() + } + } + } + + // Save directory dialog + FolderDialog { + id: summaryParentDirDialog + title: qsTr("Choose report parent directory") + } + + onProjectLocationChanged: { + summaryParentDirDialog.currentFolder = Globals.BackendWrapper.helpersLocalFileToUrl(projectLocation) } - // Save button } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Report/Sidebar/Basic/Layout.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Sidebar/Basic/Layout.qml similarity index 90% rename from src_qt6/EasyReflectometryApp/Gui/Pages/Report/Sidebar/Basic/Layout.qml rename to src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Sidebar/Basic/Layout.qml index 472d957a..faef3906 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Report/Sidebar/Basic/Layout.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Sidebar/Basic/Layout.qml @@ -13,7 +13,7 @@ import Gui.Globals as Globals EaComponents.SideBarColumn { EaElements.GroupBox { - enabled: false + enabled: Globals.BackendWrapper.summaryCreated title: qsTr('Export summary') icon: 'download' collapsed: false diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Report/Sidebar/Extra/Groups/Empty.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Sidebar/Extra/Groups/Empty.qml similarity index 100% rename from src_qt6/EasyReflectometryApp/Gui/Pages/Report/Sidebar/Extra/Groups/Empty.qml rename to src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Sidebar/Extra/Groups/Empty.qml diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Report/Sidebar/Extra/Layout.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Sidebar/Extra/Layout.qml similarity index 100% rename from src_qt6/EasyReflectometryApp/Gui/Pages/Report/Sidebar/Extra/Layout.qml rename to src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Sidebar/Extra/Layout.qml From 619589ac176793239eeefee4375f7381403b88cc Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Thu, 14 Nov 2024 15:29:11 +0100 Subject: [PATCH 03/16] python skeleton --- .../Backends/Mock/Helpers.qml | 10 -- .../Backends/Mock/Summary.qml | 10 +- .../EasyReflectometryApp/Backends/Mock/qmldir | 1 - .../Backends/Py/experiment.py | 5 +- .../Backends/Py/helpers.py | 36 ++--- .../Backends/Py/logic/summary.py | 104 +++++++++++++++ .../Backends/Py/py_backend.py | 10 +- .../Backends/Py/status.py | 2 +- .../Backends/Py/summary.py | 126 +++++------------- .../Gui/Globals/BackendWrapper.qml | 11 +- .../Summary/Sidebar/Basic/Groups/Export.qml | 27 ++-- 11 files changed, 193 insertions(+), 149 deletions(-) delete mode 100644 src_qt6/EasyReflectometryApp/Backends/Mock/Helpers.qml create mode 100644 src_qt6/EasyReflectometryApp/Backends/Py/logic/summary.py diff --git a/src_qt6/EasyReflectometryApp/Backends/Mock/Helpers.qml b/src_qt6/EasyReflectometryApp/Backends/Mock/Helpers.qml deleted file mode 100644 index 91e9dc33..00000000 --- a/src_qt6/EasyReflectometryApp/Backends/Mock/Helpers.qml +++ /dev/null @@ -1,10 +0,0 @@ -pragma Singleton - -import QtQuick - -QtObject { - function localFileToUrl(value) { - console.debug(`localFileToUrl ${value}`) - return `Url ${value}` - } -} \ No newline at end of file diff --git a/src_qt6/EasyReflectometryApp/Backends/Mock/Summary.qml b/src_qt6/EasyReflectometryApp/Backends/Mock/Summary.qml index 2ae7464c..41e9fc2e 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Mock/Summary.qml +++ b/src_qt6/EasyReflectometryApp/Backends/Mock/Summary.qml @@ -7,6 +7,12 @@ QtObject { readonly property var exportFormats: ["HTML", "PDF"] + readonly property string fileName: "summary" + + readonly property string filePath: '/Users/andpe/ExampleProject/summary' + + readonly property string fileUrl: 'file:///Users/andpe/ExampleProject/summary' + readonly property string asHtml: ' @@ -84,6 +90,8 @@ th, td { padding-right: 18px; } console.debug(`Saving PDF summary`) } - + function setFileName(value) { + console.debug(`setFileName ${value}`) + } } diff --git a/src_qt6/EasyReflectometryApp/Backends/Mock/qmldir b/src_qt6/EasyReflectometryApp/Backends/Mock/qmldir index cbf8be7e..9c34cc59 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Mock/qmldir +++ b/src_qt6/EasyReflectometryApp/Backends/Mock/qmldir @@ -8,4 +8,3 @@ singleton Summary Summary.qml singleton Sample Sample.qml singleton Status Status.qml singleton Plotting Plotting.qml -singleton Helpers Helpers.qml diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py b/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py index bba6372b..5f115360 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py @@ -3,9 +3,10 @@ from PySide6.QtCore import Slot from PySide6.QtCore import Property -from EasyApp.Logic.Utils.Utils import generalizePath +#from EasyApp.Logic.Utils.Utils import generalizePath from easyreflectometry import Project as ProjectLib +from .helpers import IO from .logic.models import Models as ModelsLogic from .logic.project import Project as ProjectLogic @@ -84,5 +85,5 @@ def setQElements(self, new_value: float) -> None: # Actions @Slot(str) def load(self, path: str) -> None: - self._project_logic.load_experiment(generalizePath(path)) + self._project_logic.load_experiment(IO.generalizePath(path)) self.experimentChanged.emit() \ No newline at end of file diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/helpers.py b/src_qt6/EasyReflectometryApp/Backends/Py/helpers.py index 5713c7bd..41255296 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/helpers.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/helpers.py @@ -1,22 +1,16 @@ import numpy as np +import os +import sys from uncertainties import ufloat +from urllib.parse import urlparse from PySide6.QtWidgets import QApplication from PySide6.QtCore import QUrl -from PySide6.QtCore import Slot - - -class GUI: - @Slot(str, result=str) - @staticmethod - def localFileToUrl(fpath: str): - url = QUrl.fromLocalFile(fpath).toString() - return url +#from PySide6.QtCore import Slot +#from PySide6.QtCore import QObject class IO: - - @staticmethod def generalizePath(fpath: str) -> str: """ @@ -25,13 +19,19 @@ def generalizePath(fpath: str) -> str: :param URI rcfPath: URI to the file :return URI filename: platform specific URI """ - return fpath # NEED FIX: Check on different platforms - # filename = urlparse(fpath).path - # if not sys.platform.startswith("win"): - # return filename - # if filename[0] == '/': - # filename = filename[1:].replace('/', os.path.sep) - # return filename + filename = urlparse(fpath).path + if not sys.platform.startswith("win"): + return filename + if filename[0] == '/': + filename = filename[1:].replace('/', os.path.sep) + return filename + + @staticmethod + def localFileToUrl(fpath: str) -> str: + if not sys.platform.startswith("win"): + return QUrl.fromLocalFile(fpath).toString() + url = QUrl.fromLocalFile(fpath.split(':')[-1]).toString() + return url @staticmethod def formatMsg(type, *args): diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/logic/summary.py b/src_qt6/EasyReflectometryApp/Backends/Py/logic/summary.py new file mode 100644 index 00000000..13c91a42 --- /dev/null +++ b/src_qt6/EasyReflectometryApp/Backends/Py/logic/summary.py @@ -0,0 +1,104 @@ +from easyreflectometry import Project as ProjectLib +from pathlib import Path + +class Summary: + def __init__(self, project_lib: ProjectLib): + self._project_lib = project_lib + self._created = True + self._file_name = "summary" + + @property + def created(self) -> bool: + return self._created + + @property + def file_name(self) -> str: + return self._file_name + + @file_name.setter + def file_name(self, value: str) -> None: + self._file_name = value + + @property + def file_path(self) -> Path: + return self._project_lib.path / self._file_name + + @property + def as_html(self) -> str: + return _PY_HTML + + def save_as_html(self) -> None: + print("Saving as HTML") + + def save_as_pdf(self) -> None: + print("Saving as PDF") + + +_PY_HTML = """ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Py Summary

Project information

TitleLa0.5Ba0.5CoO3
Descriptionneutrons, powder, constant wavelength
No. of phases1
No. of experiments1

Crystal data

Phase datablocklbco
Crystal system, space groupcubic,  P m -3 m

Data collection

Experiment datablockhrpt
Radiation probeneutron
Measured range: min, max, inc (°)10.0,  164.85,  0.05
+ + +""" \ No newline at end of file diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py index f4935f55..cd6714f1 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py @@ -11,7 +11,7 @@ from .sample import Sample from .status import Status from .summary import Summary -from .helpers import GUI as GUI_Helpers +#from .helpers import GUI as GUI_Helpers class PyBackend(QObject): @@ -33,7 +33,7 @@ def __init__(self, parent=None): # Plotting backend part self._plotting = Plotting1d(self._project_lib) - self._gui_helpers = GUI_Helpers() +# self._gui_helpers = GUI_Helpers() self._logger = LoggerLevelHandler(self) @@ -79,9 +79,9 @@ def plotting(self) -> Plotting1d: def logger(self): return self._logger - @Property('QVariant', constant=True) - def helpers(self): - return self._gui_helpers + # @Property('QVariant', constant=True) + # def helpers(self): + # return self._gui_helpers ######### Connections to relay info between the backend parts def _connect_backend_parts(self) -> None: diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/status.py b/src_qt6/EasyReflectometryApp/Backends/Py/status.py index 33ee2d4e..ed68145d 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/status.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/status.py @@ -40,7 +40,7 @@ def calculator(self): @Property(str, notify=minimizerChanged) def minimizer(self): - return self._logic.minimizer + return 'self._logic.minimizer' @Property(str, notify=variablesChanged) def variables(self): diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/summary.py b/src_qt6/EasyReflectometryApp/Backends/Py/summary.py index 1aa257b4..caa4bfeb 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/summary.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/summary.py @@ -5,107 +5,53 @@ from PySide6.QtCore import QObject from PySide6.QtCore import Signal from PySide6.QtCore import Property +from PySide6.QtCore import Slot from easyreflectometry import Project as ProjectLib - -_PY_HTML = """ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Py Summary

Project information

TitleLa0.5Ba0.5CoO3
Descriptionneutrons, powder, constant wavelength
No. of phases1
No. of experiments1

Crystal data

Phase datablocklbco
Crystal system, space groupcubic,  P m -3 m

Data collection

Experiment datablockhrpt
Radiation probeneutron
Measured range: min, max, inc (°)10.0,  164.85,  0.05
- - -""" - +from .logic.summary import Summary as SummaryLogic +from .helpers import IO class Summary(QObject): createdChanged = Signal() - asHtmlChanged = Signal() + fileNameChanged = Signal() def __init__(self, project_lib: ProjectLib, parent=None): super().__init__(parent) -# self._logic = ReportLogic(project_lib) - self._created = True - self._asHtml = _PY_HTML + self._logic = SummaryLogic(project_lib) @Property(bool, notify=createdChanged) def created(self): - return self._created + return self._logic.created - @created.setter - def created(self, newValue): - if self._created == newValue: - return - self._created = newValue - self.createdChanged.emit() + @Property(str, notify=fileNameChanged) + def fileName(self): + return self._logic.file_name - @Property(str, notify=asHtmlChanged) - def asHtml(self): - return self._asHtml + @Slot(str) + def setFileName(self, value: str) -> None: + self._logic.file_name = value + self.fileNameChanged.emit() - @asHtml.setter - def asHtml(self, newValue): - if self._asHtml == newValue: - return - self._asHtml = newValue - self.asHtmlChanged.emit + @Property(str, notify=fileNameChanged) + def filePath(self) -> str: + return str(self._logic.file_path) + + @Property(str, notify=fileNameChanged) + def fileUrl(self) -> str: + return IO.localFileToUrl(str(self._logic.file_path)) + + @Property(str, notify=createdChanged) + def asHtml(self): + return self._logic.as_html + + @Property('QVariant') + def exportFormats(self): + return ['HTML', 'PDF'] + + @Slot() + def saveAsHtml(self) -> None: + self._logic.save_as_html() + + @Slot() + def saveAsPdf(self) -> None: + self._logic.save_as_pdf() diff --git a/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml b/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml index 448c4118..dad2b5a5 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml @@ -179,8 +179,12 @@ QtObject { /////////////// readonly property bool summaryCreated: activeBackend.summary.created readonly property string summaryAsHtml: activeBackend.summary.asHtml + readonly property string summaryFileName: activeBackend.summary.fileName + readonly property string summaryFilePath: activeBackend.summary.filePath + readonly property string summaryFileUrl: activeBackend.summary.fileUrl readonly property var summaryExportFormats: activeBackend.summary.exportFormats + function summarySetFileName(value) { activeBackend.summary.setFileName(value) } function summarySaveAsHtml() { activeBackend.summary.saveAsHtml() } function summarySaveAsPdf() { activeBackend.summary.saveAsPdf() } @@ -204,11 +208,4 @@ QtObject { readonly property var plottingExperimentMaxY: activeBackend.plotting.sampleMaxY function plottingSetQtChartsSerieRef(value1, value2, value3) { activeBackend.plotting.setQtChartsSerieRef(value1, value2, value3) } - - - /////////////// - // Helpers - /////////////// - - function helpersLocalFileToUrl(value) { return activeBackend.helpers.localFileToUrl(value) } } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Sidebar/Basic/Groups/Export.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Sidebar/Basic/Groups/Export.qml index f8dd2922..72e4678a 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Sidebar/Basic/Groups/Export.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Sidebar/Basic/Groups/Export.qml @@ -15,10 +15,9 @@ import Gui.Globals as Globals Column { - - property string projectLocation: Globals.BackendWrapper.projectLocation + - EaLogic.Utils.osPathSep() + - 'summary' +// property string summaryLocation: Globals.BackendWrapper.projectLocation + +// EaLogic.Utils.osPathSep() + +// Globals.BackendWrapper.summaryFileName spacing: EaStyle.Sizes.fontPixelSize @@ -34,7 +33,8 @@ Column { topPadding: topInset + padding horizontalAlignment: TextInput.AlignLeft placeholderText: qsTr('Enter summary file name here') - Component.onCompleted: text = 'summary' + Component.onCompleted: text = Globals.BackendWrapper.summaryFileName + onEditingFinished: Globals.BackendWrapper.summarySetFileName(text) EaElements.Label { id: nameLabel text: qsTr('Name') @@ -46,8 +46,7 @@ Column { topInset: formatLabel.height topPadding: topInset + padding width: EaStyle.Sizes.fontPixelSize * 10 - model: Globals.BackendWrapper.summaryExportFormats// [ - + model: Globals.BackendWrapper.summaryExportFormats EaElements.Label { id: formatLabel text: qsTr('Format') @@ -65,9 +64,8 @@ Column { topPadding: topInset + padding rightPadding: chooseButton.width horizontalAlignment: TextInput.AlignLeft - placeholderText: qsTr('Enter report location here') - Component.onCompleted: text = projectLocation - +// placeholderText: qsTr('Enter report location here') + Component.onCompleted: text = Globals.BackendWrapper.summaryFilePath EaElements.Label { id: locationLabel text: qsTr('Location') @@ -79,7 +77,7 @@ Column { topPadding: parent.topPadding showBackground: false fontIcon: 'folder-open' - ToolTip.text: qsTr('Choose report parent directory') + ToolTip.text: qsTr('Choose summary parent directory') onClicked: summaryParentDirDialog.open() } } @@ -103,10 +101,11 @@ Column { FolderDialog { id: summaryParentDirDialog title: qsTr("Choose report parent directory") + currentFolder: Globals.BackendWrapper.summaryFileUrl } - onProjectLocationChanged: { - summaryParentDirDialog.currentFolder = Globals.BackendWrapper.helpersLocalFileToUrl(projectLocation) - } +// onSummaryLocationChanged: { +// summaryParentDirDialog.currentFolder = Globals.BackendWrapper.helpersLocalFileToUrl(summaryLocation) +// } } From 7aec72dde1ba659213aad82ea387dd9bd4f0d90e Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Fri, 15 Nov 2024 13:58:45 +0100 Subject: [PATCH 04/16] Fitter to MultiFitter --- EasyReflectometryApp/Logic/Proxies/Fitter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EasyReflectometryApp/Logic/Proxies/Fitter.py b/EasyReflectometryApp/Logic/Proxies/Fitter.py index 5d657089..bd4705a7 100644 --- a/EasyReflectometryApp/Logic/Proxies/Fitter.py +++ b/EasyReflectometryApp/Logic/Proxies/Fitter.py @@ -8,7 +8,7 @@ from easyscience import global_object -from easyreflectometry.fitting import Fitter as easyFitter +from easyreflectometry.fitting import MultiFitter as easyFitter class Fitter(QThread): From e4933ff56103242cc3915eba54e031cae60f35b2 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Fri, 15 Nov 2024 15:39:09 +0100 Subject: [PATCH 05/16] summary --- .../EasyReflectometryApp/Backends/Py/py_backend.py | 12 ++++++------ .../EasyReflectometryApp/Gui/ApplicationWindow.qml | 2 +- src_qt6/pyproject.toml | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py index 714d7ad9..ccbb3456 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py @@ -10,7 +10,7 @@ from .project import Project from .sample import Sample from .status import Status -from .report import Report +from .summary import Summary class PyBackend(QObject): @@ -26,7 +26,7 @@ def __init__(self, parent=None): self._sample = Sample(self._project_lib) self._experiment = Experiment(self._project_lib) self._analysis = Analysis(self._project_lib) - self._report = Report(self._project_lib) + self._summary = Summary(self._project_lib) self._status = Status(self._project_lib) # Plotting backend part @@ -60,8 +60,8 @@ def analysis(self) -> Analysis: return self._analysis @Property('QVariant', constant=True) - def report(self) -> Report: - return self._report + def summary(self) -> Summary: + return self._summary # Other elements @Property('QVariant', constant=True) @@ -106,10 +106,10 @@ def _connect_analysis_page(self) -> None: def _relay_project_page_name(self): self._status.statusChanged.emit() - self._report.asHtmlChanged.emit() +# self._summary.asHtmlChanged.emit() def _relay_project_page_created(self): - self._report.createdChanged.emit() + self._summary.createdChanged.emit() def _relay_project_page_project_loaded(self): self._sample.materialsTableChanged.emit() diff --git a/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml b/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml index e874e291..b125c857 100644 --- a/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml +++ b/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml @@ -143,7 +143,7 @@ EaComponents.ApplicationWindow { Loader { source: 'Pages/Project/Layout.qml' }, Loader { source: 'Pages/Sample/Layout.qml' }, Loader { source: 'Pages/Experiment/Layout.qml' }, -// Loader { source: 'Pages/Analysis/Layout.qml' }, + Loader { source: 'Pages/Analysis/Layout.qml' }, Loader { source: 'Pages/Summary/Layout.qml' } ] diff --git a/src_qt6/pyproject.toml b/src_qt6/pyproject.toml index c0e17f84..3916bd94 100644 --- a/src_qt6/pyproject.toml +++ b/src_qt6/pyproject.toml @@ -30,7 +30,7 @@ classifiers = [ requires-python = '>=3.11' dependencies = [ 'EasyApp @ git+https://github.com/EasyScience/EasyApp.git@develop', - 'easyreflectometry @ git+https://github.com/EasyScience/EasyReflectometryLib.git@199-make-fitter-a-part-of-project', + 'easyreflectometry @ git+https://github.com/EasyScience/EasyReflectometryLib.git@201-move-reporting-to-the-lib', 'PySide6==6.6', 'toml', ] From 3c89d824dac12e0ced108dcbdf343c014984f7e8 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Fri, 15 Nov 2024 15:55:56 +0100 Subject: [PATCH 06/16] using functionality in utils --- .../Backends/Py/logic/parameters.py | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/logic/parameters.py b/src_qt6/EasyReflectometryApp/Backends/Py/logic/parameters.py index 8801f240..41493143 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/logic/parameters.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/logic/parameters.py @@ -4,6 +4,9 @@ from easyscience.Constraints import NumericConstraint from easyreflectometry import Project as ProjectLib +from easyreflectometry.utils import count_fixed_parameters +from easyreflectometry.utils import count_free_parameters + from typing import List @@ -30,20 +33,10 @@ def set_current_index(self, new_value: int) -> None: return False def count_free_parameters(self) -> int: - count = 0 - parameters = self._project_lib.parameters - for parameter in parameters: - if parameter.free: - count = count + 1 - return count + return count_free_parameters(self._project_lib) def count_fixed_parameters(self) -> int: - count = 0 - parameters = self._project_lib.parameters - for parameter in parameters: - if not parameter.free: - count = count + 1 - return count + return count_fixed_parameters(self._project_lib) def set_current_parameter_value(self, new_value: str) -> bool: parameters = self._project_lib.parameters From f8d4fa8d6368cf3c8554f04cddaa8360907f89ae Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Mon, 18 Nov 2024 11:33:33 +0100 Subject: [PATCH 07/16] summary seems functional --- .../Backends/Py/logic/summary.py | 80 ++----------------- .../Backends/Py/py_backend.py | 5 ++ .../Backends/Py/summary.py | 3 +- 3 files changed, 14 insertions(+), 74 deletions(-) diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/logic/summary.py b/src_qt6/EasyReflectometryApp/Backends/Py/logic/summary.py index 13c91a42..ee33850d 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/logic/summary.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/logic/summary.py @@ -1,10 +1,14 @@ -from easyreflectometry import Project as ProjectLib from pathlib import Path +from easyreflectometry import Project as ProjectLib +from easyreflectometry.summary import Summary as SummaryLib + class Summary: def __init__(self, project_lib: ProjectLib): - self._project_lib = project_lib self._created = True + + self._project_lib = project_lib + self._summary = SummaryLib(project_lib) self._file_name = "summary" @property @@ -25,80 +29,10 @@ def file_path(self) -> Path: @property def as_html(self) -> str: - return _PY_HTML + return self._summary.compile_html_summary() def save_as_html(self) -> None: print("Saving as HTML") def save_as_pdf(self) -> None: print("Saving as PDF") - - -_PY_HTML = """ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Py Summary

Project information

TitleLa0.5Ba0.5CoO3
Descriptionneutrons, powder, constant wavelength
No. of phases1
No. of experiments1

Crystal data

Phase datablocklbco
Crystal system, space groupcubic,  P m -3 m

Data collection

Experiment datablockhrpt
Radiation probeneutron
Measured range: min, max, inc (°)10.0,  164.85,  0.05
- - -""" \ No newline at end of file diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py index ccbb3456..54c67968 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py @@ -110,6 +110,7 @@ def _relay_project_page_name(self): def _relay_project_page_created(self): self._summary.createdChanged.emit() + self._summary.summaryChanged.emit() def _relay_project_page_project_loaded(self): self._sample.materialsTableChanged.emit() @@ -120,20 +121,24 @@ def _relay_project_page_project_loaded(self): self._analysis.experimentsChanged.emit() self._analysis._clearCacheAndEmitParametersChanged() self._status.statusChanged.emit() + self._summary.summaryChanged.emit() self._refresh_plots() def _relay_sample_page_sample_changed(self): self._analysis._clearCacheAndEmitParametersChanged() self._status.statusChanged.emit() + self._summary.summaryChanged.emit() def _relay_experiment_page_experiment_changed(self): self._analysis.experimentsChanged.emit() self._analysis._clearCacheAndEmitParametersChanged() self._status.statusChanged.emit() + self._summary.summaryChanged.emit() def _relay_analysis_page(self): self._status.statusChanged.emit() self._experiment.experimentChanged.emit() + self._summary.summaryChanged.emit() def _refresh_plots(self): self._plotting.sampleChartRangesChanged.emit() diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/summary.py b/src_qt6/EasyReflectometryApp/Backends/Py/summary.py index caa4bfeb..f2f8af1b 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/summary.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/summary.py @@ -14,6 +14,7 @@ class Summary(QObject): createdChanged = Signal() fileNameChanged = Signal() + summaryChanged = Signal() def __init__(self, project_lib: ProjectLib, parent=None): super().__init__(parent) @@ -40,7 +41,7 @@ def filePath(self) -> str: def fileUrl(self) -> str: return IO.localFileToUrl(str(self._logic.file_path)) - @Property(str, notify=createdChanged) + @Property(str, notify=summaryChanged) def asHtml(self): return self._logic.as_html From b7459b4873a27345b8c7e83f82d31dea8601ba8b Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Mon, 18 Nov 2024 12:57:54 +0100 Subject: [PATCH 08/16] constraints --- .../EasyReflectometryApp/Backends/Py/logic/parameters.py | 5 ++++- src_qt6/EasyReflectometryApp/Backends/Py/sample.py | 1 + .../Pages/Sample/Sidebar/Advanced/Groups/Constraints.qml | 7 +++++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/logic/parameters.py b/src_qt6/EasyReflectometryApp/Backends/Py/logic/parameters.py index 41493143..0eecdd4d 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/logic/parameters.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/logic/parameters.py @@ -101,9 +101,12 @@ def add_constraint( independent_obj=independent ) elif arithmetic_operator == "" and independent_idx == -1: + relational_operator = relational_operator.replace("=", "==") + relational_operator = relational_operator.replace("<", ">") + relational_operator = relational_operator.replace(">", "<") constaint = NumericConstraint( dependent_obj=dependent, - operator=relational_operator.replace("=", "=="), + operator=relational_operator, value=float(value) ) else: diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/sample.py b/src_qt6/EasyReflectometryApp/Backends/Py/sample.py index a1e108d9..20fd89b8 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/sample.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/sample.py @@ -429,6 +429,7 @@ def addConstraint(self, value1: str, value2: str, value3: str, value4: str, valu arithmetic_operator=value4, independent_idx=int(value5) ) + self.externalSampleChanged.emit() # # # # Q Range diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/Sidebar/Advanced/Groups/Constraints.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/Sidebar/Advanced/Groups/Constraints.qml index d49ce999..86e4771d 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/Sidebar/Advanced/Groups/Constraints.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/Sidebar/Advanced/Groups/Constraints.qml @@ -90,10 +90,13 @@ EaElements.GroupBox { EaElements.SideBarButton { id: addConstraint - enabled: ( dependentPar.currentIndex !== -1 && independentPar.currentIndex !== -1 && independentPar.currentIndex !== dependentPar.currentIndex ) + enabled: ( + ( dependentPar.currentIndex !== -1 && independentPar.currentIndex !== -1 && independentPar.currentIndex !== dependentPar.currentIndex ) || + ( dependentPar.currentIndex !== -1 && independentPar.currentIndex === -1 ) + ) width: 35 fontIcon: "plus-circle" - ToolTip.text: qsTr("Add constraint between two parameters") + ToolTip.text: qsTr("Add Numeric or Parameter-Parameter constraint") onClicked: { Globals.BackendWrapper.sampleAddConstraint( dependentPar.currentIndex, From 19d8ee1432c1c3ebef4491dc686f1ecde727d9a8 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Mon, 18 Nov 2024 14:17:12 +0100 Subject: [PATCH 09/16] save html --- src_qt6/EasyReflectometryApp/Backends/Py/logic/summary.py | 2 +- .../Experiment/Sidebar/Basic/Groups/ExperimentalData.qml | 2 +- .../Sidebar/Basic/Groups/InstrumentParameters.qml | 6 +++--- src_qt6/EasyReflectometryApp/Gui/Pages/Project/Layout.qml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/logic/summary.py b/src_qt6/EasyReflectometryApp/Backends/Py/logic/summary.py index ee33850d..cc7b2ff2 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/logic/summary.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/logic/summary.py @@ -32,7 +32,7 @@ def as_html(self) -> str: return self._summary.compile_html_summary() def save_as_html(self) -> None: - print("Saving as HTML") + self._summary.save_html_summary(self.file_path.with_suffix('.html')) def save_as_pdf(self) -> None: print("Saving as PDF") diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/ExperimentalData.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/ExperimentalData.qml index cc6ecbf5..a2df7c2b 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/ExperimentalData.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/ExperimentalData.qml @@ -18,7 +18,7 @@ EaElements.GroupBox { enabled: true wide: true fontIcon: "upload" - text: qsTr("Import data from local drive") + text: qsTr("Import experimental data") onClicked: { console.debug(`Clicking '${text}' button ::: ${this}`) diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/InstrumentParameters.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/InstrumentParameters.qml index 76ba8e36..5b008260 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/InstrumentParameters.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/InstrumentParameters.qml @@ -45,9 +45,9 @@ EaElements.GroupBox { } EaElements.Parameter { width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 - units: "%" - text: Globals.BackendWrapper.experimentResolution - enabled: Globals.BackendWrapper.experimentExperimentalData && Globals.BackendWrapper.experimentResolution !== "-" + units: Globals.BackendWrapper.experimentResolution !== "-" ? "%" : "" + text: Globals.BackendWrapper.experimentResolution !== "-" ? Globals.BackendWrapper.experimentResolution : "Spline" + enabled: Globals.BackendWrapper.experimentResolution !== "-" && Globals.BackendWrapper.experimentExperimentalData onEditingFinished: Globals.BackendWrapper.experimentSetResolution(text) } } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Project/Layout.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Project/Layout.qml index e4728e03..ef4496fe 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Project/Layout.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Project/Layout.qml @@ -13,7 +13,7 @@ EaComponents.ContentPage { defaultInfo: Globals.BackendWrapper.projectCreated ? '' : - qsTr('No project defined') + qsTr('Using default project') mainView: EaComponents.MainContent { tabs: [ From 2f33ebbf767eb2e971931bde100dac792da0fcb4 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Mon, 18 Nov 2024 15:25:40 +0100 Subject: [PATCH 10/16] save pdf --- src_qt6/EasyReflectometryApp/Backends/Py/logic/summary.py | 6 +++++- .../Gui/Pages/Analysis/Sidebar/Basic/Groups/Fittables.qml | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/logic/summary.py b/src_qt6/EasyReflectometryApp/Backends/Py/logic/summary.py index cc7b2ff2..849835c7 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/logic/summary.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/logic/summary.py @@ -32,7 +32,11 @@ def as_html(self) -> str: return self._summary.compile_html_summary() def save_as_html(self) -> None: + if not self._project_lib.path.exists(): + self._project_lib.path.mkdir(parents=True, exist_ok=True) self._summary.save_html_summary(self.file_path.with_suffix('.html')) def save_as_pdf(self) -> None: - print("Saving as PDF") + if not self._project_lib.path.exists(): + self._project_lib.path.mkdir(parents=True, exist_ok=True) + self._summary.save_pdf_summary(self.file_path.with_suffix('.pdf')) diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Analysis/Sidebar/Basic/Groups/Fittables.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Analysis/Sidebar/Basic/Groups/Fittables.qml index 6ca4d3ef..9f0a7dbc 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Analysis/Sidebar/Basic/Groups/Fittables.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Analysis/Sidebar/Basic/Groups/Fittables.qml @@ -161,7 +161,7 @@ EaElements.GroupBox { } EaComponents.TableViewLabel { - width: EaStyle.Sizes.fontPixelSize * 2.0 + width: EaStyle.Sizes.fontPixelSize * 3.0 horizontalAlignment: Text.AlignLeft //text: qsTr("units") } @@ -232,7 +232,7 @@ EaElements.GroupBox { } EaComponents.TableViewLabel { - text: Globals.BackendWrapper.analysisFitableParameters[index].units + text: Globals.BackendWrapper.analysisFitableParameters[index].units !== 'dimensionless' ? Globals.BackendWrapper.analysisFitableParameters[index].units : "" color: EaStyle.Colors.themeForegroundMinor } From a4741255ae52147023739095e358d4b6237dc5e9 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Wed, 20 Nov 2024 08:52:56 +0100 Subject: [PATCH 11/16] summary and documentation link --- src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml | 2 +- src_qt6/EasyReflectometryApp/Gui/Pages/Home/Layout.qml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml b/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml index b125c857..4befd413 100644 --- a/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml +++ b/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml @@ -123,7 +123,7 @@ EaComponents.ApplicationWindow { // Summary page EaElements.AppBarTabButton { id: summaryButton - enabled: true + enabled: false fontIcon: "clipboard-list" text: qsTr("Summary") ToolTip.text: qsTr("Summary of the work done") diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Home/Layout.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Home/Layout.qml index 3dbf42b6..65a3b12b 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Home/Layout.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Home/Layout.qml @@ -106,7 +106,7 @@ Item { EaElements.Button { text: qsTr('Online documentation') - onClicked: Qt.openUrlExternally(Globals.BackendWrapper.home.documentationUrl) + onClicked: Qt.openUrlExternally(Globals.BackendWrapper.homeUrlsDocumentation) } } // Right links From 8d51a81aa641d93339ff3ba91040fce58512ca7a Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Wed, 20 Nov 2024 09:11:24 +0100 Subject: [PATCH 12/16] code cleaning --- src_qt6/pyproject.toml | 2 -- 1 file changed, 2 deletions(-) diff --git a/src_qt6/pyproject.toml b/src_qt6/pyproject.toml index 3916bd94..7bc6136b 100644 --- a/src_qt6/pyproject.toml +++ b/src_qt6/pyproject.toml @@ -34,8 +34,6 @@ dependencies = [ 'PySide6==6.6', 'toml', ] -# pip install easyscience@git+https://github.com/EasyScience/EasyScience.git@81-to-increase-usability-of-minimizer-it-should-be-possible-to-set-the-tolerance-and-the-max-number-of-iteration - [project.urls] homepage = 'https://easyreflectometry.org' From 5d305e9f9f23c8891c150a0839d43d568dbdaf96 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Wed, 20 Nov 2024 12:46:15 +0100 Subject: [PATCH 13/16] reset adjustments --- src_qt6/EasyReflectometryApp/Backends/Py/logic/project.py | 1 + src_qt6/EasyReflectometryApp/Backends/Py/project.py | 2 ++ src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py | 5 +++-- src_qt6/EasyReflectometryApp/Gui/Pages/Project/Layout.qml | 1 + src_qt6/EasyReflectometryApp/Gui/Pages/Sample/Layout.qml | 1 - 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/logic/project.py b/src_qt6/EasyReflectometryApp/Backends/Py/logic/project.py index ed096cf9..03e2e834 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/logic/project.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/logic/project.py @@ -103,3 +103,4 @@ def load_experiment(self, path: str) -> None: def reset(self) -> None: self._project_lib.reset() + self._project_lib.default_model() diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/project.py b/src_qt6/EasyReflectometryApp/Backends/Py/project.py index 71e1e11e..608bf993 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/project.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/project.py @@ -18,6 +18,7 @@ class Project(QObject): externalCreatedChanged = Signal() externalNameChanged = Signal() externalProjectLoaded = Signal() + externalProjectReset = Signal() def __init__(self, project_lib: ProjectLib, parent=None): super().__init__(parent) @@ -100,3 +101,4 @@ def reset(self) -> None: self.locationChanged.emit() self.externalCreatedChanged.emit() self.externalNameChanged.emit() + self.externalProjectReset.emit() diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py index 54c67968..0baf7325 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py @@ -87,7 +87,8 @@ def _connect_backend_parts(self) -> None: def _connect_project_page(self) -> None: self._project.externalNameChanged.connect(self._relay_project_page_name) self._project.externalCreatedChanged.connect(self._relay_project_page_created) - self._project.externalProjectLoaded.connect(self._relay_project_page_project_loaded) + self._project.externalProjectLoaded.connect(self._relay_project_page_project_changed) + self._project.externalProjectReset.connect(self._relay_project_page_project_changed) def _connect_sample_page(self) -> None: self._sample.externalSampleChanged.connect(self._relay_sample_page_sample_changed) @@ -112,7 +113,7 @@ def _relay_project_page_created(self): self._summary.createdChanged.emit() self._summary.summaryChanged.emit() - def _relay_project_page_project_loaded(self): + def _relay_project_page_project_changed(self): self._sample.materialsTableChanged.emit() self._sample.modelsTableChanged.emit() self._sample.assembliesTableChanged.emit() diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Project/Layout.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Project/Layout.qml index ef4496fe..52dbe368 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Project/Layout.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Project/Layout.qml @@ -38,6 +38,7 @@ EaComponents.ContentPage { continueButton.onClicked: { console.debug(`Clicking '${continueButton.text}' button ::: ${this}`) + Globals.References.resetActive = true Globals.References.applicationWindow.appBarCentralTabs.sampleButton.enabled = true Globals.References.applicationWindow.appBarCentralTabs.sampleButton.toggle() } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/Layout.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/Layout.qml index 5dc96c1d..b8d7ee1b 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/Layout.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/Layout.qml @@ -43,7 +43,6 @@ EaComponents.ContentPage { continueButton.text: qsTr('Continue') continueButton.onClicked: { console.debug(`Clicking '${continueButton.text}' button ::: ${this}`) - Globals.References.resetActive = true Globals.References.applicationWindow.appBarCentralTabs.experimentButton.enabled = true Globals.References.applicationWindow.appBarCentralTabs.experimentButton.toggle() } From 4b670cf70f4be00ae02ea5eddfac51a607e927d8 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Wed, 20 Nov 2024 13:18:48 +0100 Subject: [PATCH 14/16] reset timing --- src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml b/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml index 4befd413..944e4e52 100644 --- a/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml +++ b/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml @@ -30,9 +30,6 @@ EaComponents.ApplicationWindow { fontIcon: "backspace" ToolTip.text: qsTr("Reset to initial state without project, models and data") onClicked: { - Globals.References.resetActive = false - Globals.BackendWrapper.projectReset() - Globals.References.applicationWindow.appBarCentralTabs.projectButton.toggle() if (Globals.References.applicationWindow.appBarCentralTabs.sampleButton !== null) { Globals.References.applicationWindow.appBarCentralTabs.sampleButton.enabled = false } @@ -45,6 +42,10 @@ EaComponents.ApplicationWindow { if (Globals.References.applicationWindow.appBarCentralTabs.summaryButton !== null) { Globals.References.applicationWindow.appBarCentralTabs.summaryButton.enabled = false } + + Globals.BackendWrapper.projectReset() + Globals.References.applicationWindow.appBarCentralTabs.projectButton.toggle() + Globals.References.resetActive = false } } ] From 64e6cd7e8cf99c6c4560706b69d723569e264752 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Thu, 21 Nov 2024 06:38:15 +0100 Subject: [PATCH 15/16] minor adjustments --- .../EasyReflectometryApp/Gui/Pages/Project/Layout.qml | 2 +- .../Gui/Pages/Summary/Sidebar/Basic/Groups/Export.qml | 9 --------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Project/Layout.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Project/Layout.qml index 52dbe368..7170e926 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Project/Layout.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Project/Layout.qml @@ -13,7 +13,7 @@ EaComponents.ContentPage { defaultInfo: Globals.BackendWrapper.projectCreated ? '' : - qsTr('Using default project') + qsTr('Using default project\n' + Globals.BackendWrapper.projectName) mainView: EaComponents.MainContent { tabs: [ diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Sidebar/Basic/Groups/Export.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Sidebar/Basic/Groups/Export.qml index 72e4678a..b8752b24 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Sidebar/Basic/Groups/Export.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Sidebar/Basic/Groups/Export.qml @@ -15,10 +15,6 @@ import Gui.Globals as Globals Column { -// property string summaryLocation: Globals.BackendWrapper.projectLocation + -// EaLogic.Utils.osPathSep() + -// Globals.BackendWrapper.summaryFileName - spacing: EaStyle.Sizes.fontPixelSize // Name field + format selector @@ -64,7 +60,6 @@ Column { topPadding: topInset + padding rightPadding: chooseButton.width horizontalAlignment: TextInput.AlignLeft -// placeholderText: qsTr('Enter report location here') Component.onCompleted: text = Globals.BackendWrapper.summaryFilePath EaElements.Label { id: locationLabel @@ -104,8 +99,4 @@ Column { currentFolder: Globals.BackendWrapper.summaryFileUrl } -// onSummaryLocationChanged: { -// summaryParentDirDialog.currentFolder = Globals.BackendWrapper.helpersLocalFileToUrl(summaryLocation) -// } - } From bc938febbb40e5048708311794564a7a41da00cc Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Thu, 21 Nov 2024 14:09:11 +0100 Subject: [PATCH 16/16] use released version of lib --- src_qt6/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_qt6/pyproject.toml b/src_qt6/pyproject.toml index 7bc6136b..66aadb20 100644 --- a/src_qt6/pyproject.toml +++ b/src_qt6/pyproject.toml @@ -30,7 +30,7 @@ classifiers = [ requires-python = '>=3.11' dependencies = [ 'EasyApp @ git+https://github.com/EasyScience/EasyApp.git@develop', - 'easyreflectometry @ git+https://github.com/EasyScience/EasyReflectometryLib.git@201-move-reporting-to-the-lib', + 'easyreflectometry', 'PySide6==6.6', 'toml', ]