diff --git a/src_qt6/EasyReflectometryApp/Backends/Mock/Report.qml b/src_qt6/EasyReflectometryApp/Backends/Mock/Summary.qml similarity index 71% rename from src_qt6/EasyReflectometryApp/Backends/Mock/Report.qml rename to src_qt6/EasyReflectometryApp/Backends/Mock/Summary.qml index 11b08a1f..41e9fc2e 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Mock/Report.qml +++ b/src_qt6/EasyReflectometryApp/Backends/Mock/Summary.qml @@ -3,7 +3,15 @@ pragma Singleton import QtQuick QtObject { - property bool created: true + readonly property bool created: true + + 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: ' @@ -74,5 +82,16 @@ th, td { padding-right: 18px; } ' + function saveAsHtml() { + console.debug(`Saving HTML summary`) + } + + function saveAsPdf() { + 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 b0b8eaa3..9c34cc59 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Mock/qmldir +++ b/src_qt6/EasyReflectometryApp/Backends/Mock/qmldir @@ -4,7 +4,7 @@ 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 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/experiment.py b/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py index 438c2c4c..21fc08e8 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 @@ -55,6 +56,6 @@ def setBackground(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() self.externalExperimentChanged.emit() diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/helpers.py b/src_qt6/EasyReflectometryApp/Backends/Py/helpers.py index 7534c896..41255296 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/helpers.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/helpers.py @@ -1,11 +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 +#from PySide6.QtCore import QObject class IO: - @staticmethod def generalizePath(fpath: str) -> str: """ @@ -14,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): @@ -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/logic/parameters.py b/src_qt6/EasyReflectometryApp/Backends/Py/logic/parameters.py index 8801f240..0eecdd4d 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 @@ -108,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/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/logic/summary.py b/src_qt6/EasyReflectometryApp/Backends/Py/logic/summary.py new file mode 100644 index 00000000..849835c7 --- /dev/null +++ b/src_qt6/EasyReflectometryApp/Backends/Py/logic/summary.py @@ -0,0 +1,42 @@ +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._created = True + + self._project_lib = project_lib + self._summary = SummaryLib(project_lib) + 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 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: + 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/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 714d7ad9..0baf7325 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) @@ -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) @@ -106,12 +107,13 @@ 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() + 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() @@ -120,20 +122,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/report.py b/src_qt6/EasyReflectometryApp/Backends/Py/report.py deleted file mode 100644 index 72be6037..00000000 --- a/src_qt6/EasyReflectometryApp/Backends/Py/report.py +++ /dev/null @@ -1,111 +0,0 @@ -# SPDX-FileCopyrightText: 2024 EasyApp contributors -# SPDX-License-Identifier: BSD-3-Clause -# © 2024 Contributors to the EasyApp project - -from PySide6.QtCore import QObject -from PySide6.QtCore import Signal -from PySide6.QtCore import Property - -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
- - -""" - - -class Report(QObject): - createdChanged = Signal() - asHtmlChanged = Signal() - - def __init__(self, project_lib: ProjectLib, parent=None): - super().__init__(parent) -# self._logic = ReportLogic(project_lib) - self._created = True - self._asHtml = _PY_HTML - - @Property(bool, notify=createdChanged) - def created(self): - return self._created - - @created.setter - def created(self, newValue): - if self._created == newValue: - return - self._created = newValue - self.createdChanged.emit() - - @Property(str, notify=asHtmlChanged) - def asHtml(self): - return self._asHtml - - @asHtml.setter - def asHtml(self, newValue): - if self._asHtml == newValue: - return - self._asHtml = newValue - self.asHtmlChanged.emit 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/Backends/Py/summary.py b/src_qt6/EasyReflectometryApp/Backends/Py/summary.py new file mode 100644 index 00000000..f2f8af1b --- /dev/null +++ b/src_qt6/EasyReflectometryApp/Backends/Py/summary.py @@ -0,0 +1,58 @@ +# SPDX-FileCopyrightText: 2024 EasyApp contributors +# SPDX-License-Identifier: BSD-3-Clause +# © 2024 Contributors to the EasyApp project + +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 +from .logic.summary import Summary as SummaryLogic +from .helpers import IO + +class Summary(QObject): + createdChanged = Signal() + fileNameChanged = Signal() + summaryChanged = Signal() + + def __init__(self, project_lib: ProjectLib, parent=None): + super().__init__(parent) + self._logic = SummaryLogic(project_lib) + + @Property(bool, notify=createdChanged) + def created(self): + return self._logic.created + + @Property(str, notify=fileNameChanged) + def fileName(self): + return self._logic.file_name + + @Slot(str) + def setFileName(self, value: str) -> None: + self._logic.file_name = value + self.fileNameChanged.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=summaryChanged) + 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/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 } } ] diff --git a/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml b/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml index 35bdac2c..d8ca4f3a 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml @@ -179,6 +179,7 @@ QtObject { function experimentLoad(value) { activeBackend.experiment.load(value) } + /////////////// // Analysis page /////////////// @@ -224,8 +225,17 @@ 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 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() } + /////////////// // Plotting 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 } 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/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 diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Project/Layout.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Project/Layout.qml index e4728e03..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('No project defined') + qsTr('Using default project\n' + Globals.BackendWrapper.projectName) mainView: EaComponents.MainContent { tabs: [ @@ -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() } 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, diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Layout.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Layout.qml index bcd1da83..223ccffa 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/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/Summary/Sidebar/Basic/Groups/Export.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Sidebar/Basic/Groups/Export.qml index 9b4177d8..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 @@ -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 @@ -16,11 +15,6 @@ import Gui.Globals as Globals Column { - - property string projectLocation: Globals.BackendWrapper.projectLocation + - EaLogic.Utils.osPathSep() + - 'summary' - spacing: EaStyle.Sizes.fontPixelSize // Name field + format selector @@ -35,25 +29,20 @@ 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') } } - // 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') @@ -71,9 +60,7 @@ Column { topPadding: topInset + padding rightPadding: chooseButton.width horizontalAlignment: TextInput.AlignLeft - placeholderText: qsTr('Enter report location here') - Component.onCompleted: text = projectLocation - + Component.onCompleted: text = Globals.BackendWrapper.summaryFilePath EaElements.Label { id: locationLabel text: qsTr('Location') @@ -85,11 +72,10 @@ Column { topPadding: parent.topPadding showBackground: false fontIcon: 'folder-open' - ToolTip.text: qsTr('Choose report parent directory') - onClicked: reportParentDirDialog.open() + ToolTip.text: qsTr('Choose summary parent directory') + onClicked: summaryParentDirDialog.open() } } - // Location field // Save button EaElements.SideBarButton { @@ -97,7 +83,20 @@ 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") + currentFolder: Globals.BackendWrapper.summaryFileUrl } - // Save button } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Sidebar/Basic/Layout.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/Sidebar/Basic/Layout.qml index 472d957a..faef3906 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Summary/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/pyproject.toml b/src_qt6/pyproject.toml index c0e17f84..66aadb20 100644 --- a/src_qt6/pyproject.toml +++ b/src_qt6/pyproject.toml @@ -30,12 +30,10 @@ 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', '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'