"""Modal dialog for reduction options.
Dialog to select reduction options to choose which outputs are needed
and in which formats to write them.
"""
import os
from qtpy import QtCore, QtWidgets
from quicknxs.models.configuration import OutputOptions
from quicknxs.views.load_ui import load_ui
[docs]
class ReductionDialog(QtWidgets.QDialog):
"""Reduction dialog."""
default_template = "{instrument}_{numbers}_{peak}_{item}_{state}.{type}"
def __init__(self, parent):
super().__init__(parent)
self.ui = load_ui("ui_reduce_dialog.ui", base_instance=self)
self.settings = QtCore.QSettings(".quicknxs")
self.ui.directoryEntry.setText(self.settings.value("output_directory", os.path.expanduser("~")))
self.ui.fileNameEntry.setText(self.settings.value("output_file_template", ReductionDialog.default_template))
# Outputs
self.ui.exportSpecular.setChecked(self._verify_true("export_specular", True))
self.ui.export_SA.setChecked(self._verify_true("export_asym", True))
self.ui.exportGISANS.setChecked(self._verify_true("export_gisans", False))
self.ui.exportOffSpecular.setChecked(self._verify_true("export_offspec", False))
self.ui.intensitySmoothingCheckbox.setChecked(self._verify_true("apply_smoothing", False))
self.ui.exportOffSpecularSlices.setChecked(self._verify_true("export_offspec_slices", False))
# Formats
self.ui.matlab.setChecked(self._verify_true("format_matlab", False))
self.ui.numpy.setChecked(self._verify_true("format_numpy", False))
self.ui.mantid_script_checkbox.setChecked(self._verify_true("format_mantid", False))
self.ui.five_cols_checkbox.setChecked(self._verify_true("format_5cols", True))
# Emails
self.ui.emailSend.setChecked(self._verify_true("email_send", False))
self.ui.emailZIPData.setChecked(self._verify_true("email_zip_data", True))
self.ui.emailSendPlots.setChecked(self._verify_true("email_send_plots", False))
self.ui.emailSendData.setChecked(self._verify_true("email_send_data", True))
self.ui.emailTo.setText(self.settings.value("email_to", ""))
self.ui.emailCc.setText(self.settings.value("email_cc", ""))
self.ui.emailSubject.setText(self.settings.value("email_subject", ""))
self.is_accepted = False
def _verify_true(self, parameter, default):
"""Utility function to read a bool."""
_value = self.settings.value(parameter, str(default))
return str(_value).lower() == "true"
[docs]
def accept(self):
"""Save the current options and close dialog."""
self.save_settings()
self.is_accepted = True
self.close()
[docs]
def get_options(self):
"""Return the reduction options as a dict."""
if self.is_accepted is False:
return None
return OutputOptions(
export_specular=self.ui.exportSpecular.isChecked(),
export_asym=self.ui.export_SA.isChecked(),
export_gisans=self.ui.exportGISANS.isChecked(),
export_offspec=self.ui.exportOffSpecular.isChecked(),
apply_smoothing=self.ui.intensitySmoothingCheckbox.isChecked(),
export_offspec_slices=self.ui.exportOffSpecularSlices.isChecked(),
format_matlab=self.ui.matlab.isChecked(),
format_mantid=self.ui.mantid_script_checkbox.isChecked(),
format_numpy=self.ui.numpy.isChecked(),
format_5cols=self.ui.five_cols_checkbox.isChecked(),
output_directory=self.ui.directoryEntry.text(),
output_file_template=self.ui.fileNameEntry.text(),
email_send=self.ui.emailSend.isChecked(),
email_zip_data=self.ui.emailZIPData.isChecked(),
email_send_plots=self.ui.emailSendPlots.isChecked() or self.ui.emailSendAll.isChecked(),
email_send_data=self.ui.emailSendData.isChecked() or self.ui.emailSendAll.isChecked(),
email_to=self.ui.emailTo.text(),
email_cc=self.ui.emailCc.text(),
email_subject=self.ui.emailSubject.text(),
email_text=self.ui.emailText.toPlainText(),
)
[docs]
def change_directory(self):
"""Change the output directory."""
old_d = self.ui.directoryEntry.text()
new_d = QtWidgets.QFileDialog.getExistingDirectory(parent=self, caption="Select new directory", directory=old_d)
if new_d is not None:
self.ui.directoryEntry.setText(new_d)
[docs]
def reset_filename_template(self):
"""Reset the filename template to the default."""
self.ui.fileNameEntry.setText(ReductionDialog.default_template)
[docs]
def save_settings(self) -> None:
"""Save reduction options in QSettings."""
self.settings.setValue("output_directory", self.ui.directoryEntry.text())
self.settings.setValue("output_file_template", self.ui.fileNameEntry.text())
# Save output checkboxes
self.settings.setValue("export_specular", self.ui.exportSpecular.isChecked())
self.settings.setValue("export_asym", self.ui.export_SA.isChecked())
self.settings.setValue("export_gisans", self.ui.exportGISANS.isChecked())
self.settings.setValue("export_offspec", self.ui.exportOffSpecular.isChecked())
self.settings.setValue("apply_smoothing", self.ui.intensitySmoothingCheckbox.isChecked())
self.settings.setValue("export_offspec_slices", self.ui.exportOffSpecularSlices.isChecked())
# Save format checkboxes
self.settings.setValue("format_matlab", self.ui.matlab.isChecked())
self.settings.setValue("format_numpy", self.ui.numpy.isChecked())
self.settings.setValue("format_mantid", self.ui.mantid_script_checkbox.isChecked())
self.settings.setValue("format_5cols", self.ui.five_cols_checkbox.isChecked())
# Save email settings
self.settings.setValue("email_send", self.ui.emailSend.isChecked())
self.settings.setValue("email_zip_data", self.ui.emailZIPData.isChecked())
self.settings.setValue("email_send_plots", self.ui.emailSendPlots.isChecked())
self.settings.setValue("email_send_data", self.ui.emailSendData.isChecked())
self.settings.setValue("email_to", self.ui.emailTo.text())
self.settings.setValue("email_cc", self.ui.emailCc.text())
self.settings.setValue("email_subject", self.ui.emailSubject.text())