From 9170775c70c56433448e330643b824b06275b26a Mon Sep 17 00:00:00 2001 From: Stefano Simonelli <16114781+s-simoncelli@users.noreply.github.com> Date: Sat, 17 Feb 2024 08:17:18 +0000 Subject: [PATCH] Close parent dialog when a form is saved to improve UX --- pywr_editor/dialogs/includes/includes_dialog.py | 2 +- pywr_editor/dialogs/metadata/metadata_dialog.py | 12 +++++++++++- .../dialogs/metadata/metadata_form_widget.py | 4 ---- pywr_editor/dialogs/node/node_dialog.py | 13 +++++++++++-- .../dictionary/dictionary_item_form_widget.py | 1 + .../external_data_picker_form_widget.py | 1 + .../model_component_picker_dialog.py | 1 + .../parameters/scenarios/scenario_values_widget.py | 14 +++++++++----- pywr_editor/schematic/shapes/shape_dialogs.py | 2 ++ 9 files changed, 37 insertions(+), 13 deletions(-) diff --git a/pywr_editor/dialogs/includes/includes_dialog.py b/pywr_editor/dialogs/includes/includes_dialog.py index 9e537755..f10930a4 100644 --- a/pywr_editor/dialogs/includes/includes_dialog.py +++ b/pywr_editor/dialogs/includes/includes_dialog.py @@ -288,7 +288,7 @@ def on_save(self) -> None: panel: LibraryPanel = self.app.findChild(LibraryPanel) panel.reload() - self.save_button.setEnabled(False) + self.close() @Slot() def on_value_change(self) -> None: diff --git a/pywr_editor/dialogs/metadata/metadata_dialog.py b/pywr_editor/dialogs/metadata/metadata_dialog.py index 6b76acf5..62681024 100644 --- a/pywr_editor/dialogs/metadata/metadata_dialog.py +++ b/pywr_editor/dialogs/metadata/metadata_dialog.py @@ -1,6 +1,6 @@ from typing import TYPE_CHECKING, Union -from PySide6.QtCore import Qt +from PySide6.QtCore import Qt, Slot from PySide6.QtWidgets import QDialog, QHBoxLayout, QVBoxLayout from pywr_editor.model import ModelConfig @@ -33,6 +33,7 @@ def __init__( button_box = QHBoxLayout() self.save_button = PushIconButton(icon="msc.save", label="Save", accent=True) self.save_button.setObjectName("save_button") + self.save_button.clicked.connect(self.on_form_save) close_button = PushIconButton(icon="msc.close", label="Close") # noinspection PyUnresolvedReferences @@ -57,3 +58,12 @@ def __init__( self.setMinimumSize(600, 600) self.setMaximumSize(600, 600) self.setWindowModality(Qt.WindowModality.WindowModal) + + @Slot() + def on_form_save(self) -> None: + """ + Save the form and close the dialog. + :return: None + """ + self.form.on_save() + self.close() diff --git a/pywr_editor/dialogs/metadata/metadata_form_widget.py b/pywr_editor/dialogs/metadata/metadata_form_widget.py index 58fd7b8b..3cf27835 100644 --- a/pywr_editor/dialogs/metadata/metadata_form_widget.py +++ b/pywr_editor/dialogs/metadata/metadata_form_widget.py @@ -75,10 +75,6 @@ def __init__( parent=parent, ) - # save form with button click - # noinspection PyUnresolvedReferences - parent.save_button.clicked.connect(self.on_save) - @staticmethod def _check_version_number(name: str, label: str, value: str) -> Validation: """ diff --git a/pywr_editor/dialogs/node/node_dialog.py b/pywr_editor/dialogs/node/node_dialog.py index bdb83fb4..3f232da0 100644 --- a/pywr_editor/dialogs/node/node_dialog.py +++ b/pywr_editor/dialogs/node/node_dialog.py @@ -1,6 +1,6 @@ from typing import TYPE_CHECKING, Type, Union -from PySide6.QtCore import QSize, Qt +from PySide6.QtCore import QSize, Qt, Slot from PySide6.QtGui import QWindow from PySide6.QtWidgets import QDialog, QHBoxLayout, QLabel, QVBoxLayout, QWidget @@ -58,7 +58,7 @@ def __init__( parent=self, ) # noinspection PyUnresolvedReferences - save_button.clicked.connect(self.form.save) + save_button.clicked.connect(self.on_form_save) layout.addWidget(self.title) layout.addWidget(self.form) @@ -69,6 +69,15 @@ def __init__( self.setMinimumSize(750, 650) self.setWindowModality(Qt.WindowModality.WindowModal) + @Slot() + def on_form_save(self) -> None: + """ + Save the form and close the dialog. + :return: None + """ + self.form.save() + self.close() + class NodeDialogTitle(QWidget): # fit all node icons diff --git a/pywr_editor/form/widgets/dictionary/dictionary_item_form_widget.py b/pywr_editor/form/widgets/dictionary/dictionary_item_form_widget.py index 7afbbb7b..5a3e09e6 100644 --- a/pywr_editor/form/widgets/dictionary/dictionary_item_form_widget.py +++ b/pywr_editor/form/widgets/dictionary/dictionary_item_form_widget.py @@ -213,3 +213,4 @@ def on_save(self) -> None | bool: # callback function self.after_save(form_data, self.additional_data) + self.parent.close() diff --git a/pywr_editor/form/widgets/external_data_picker/external_data_picker_form_widget.py b/pywr_editor/form/widgets/external_data_picker/external_data_picker_form_widget.py index 068cae5f..a4a1c0c9 100644 --- a/pywr_editor/form/widgets/external_data_picker/external_data_picker_form_widget.py +++ b/pywr_editor/form/widgets/external_data_picker/external_data_picker_form_widget.py @@ -127,3 +127,4 @@ def on_save(self) -> None | bool: # callback function self.after_save(form_data) + self.parent.close() diff --git a/pywr_editor/form/widgets/model_component_picker_dialog/model_component_picker_dialog.py b/pywr_editor/form/widgets/model_component_picker_dialog/model_component_picker_dialog.py index eb78cc8a..962e9ecb 100644 --- a/pywr_editor/form/widgets/model_component_picker_dialog/model_component_picker_dialog.py +++ b/pywr_editor/form/widgets/model_component_picker_dialog/model_component_picker_dialog.py @@ -154,6 +154,7 @@ def on_save(self) -> None: # callback function self.after_form_save(form_data, self.additional_data) + self.close() @property def is_parameter(self) -> bool: diff --git a/pywr_editor/form/widgets/parameters/scenarios/scenario_values_widget.py b/pywr_editor/form/widgets/parameters/scenarios/scenario_values_widget.py index eb5707fe..0f7d20a6 100644 --- a/pywr_editor/form/widgets/parameters/scenarios/scenario_values_widget.py +++ b/pywr_editor/form/widgets/parameters/scenarios/scenario_values_widget.py @@ -57,6 +57,7 @@ def __init__( # noinspection PyTypeChecker self.dialog: "ParametersDialog" = self.form.parent + self.nested_dialog: ScenarioValuesPickerDialogWidget | None = None self.model_config = self.form.model_config self.scenario_size: int | None = None self.data_type = data_type @@ -213,7 +214,7 @@ def on_edit_ensemble(self) -> None: """ current_index = self.list.selectionModel().selection().indexes()[0].row() - dialog = ScenarioValuesPickerDialogWidget( + self.nested_dialog = ScenarioValuesPickerDialogWidget( model_config=self.model_config, values=self.model.values[current_index], additional_data={ @@ -226,7 +227,7 @@ def on_edit_ensemble(self) -> None: after_form_save=self.on_form_save, parent=self.dialog, ) - dialog.open() + self.nested_dialog.open() @Slot() def on_add_new_ensemble(self) -> None: @@ -234,7 +235,7 @@ def on_add_new_ensemble(self) -> None: Opens the dialog to add new ensemble values. :return: None """ - dialog = ScenarioValuesPickerDialogWidget( + self.nested_dialog = ScenarioValuesPickerDialogWidget( model_config=self.model_config, additional_data={ "ensemble_number": self.model.rowCount() + 1, @@ -244,7 +245,7 @@ def on_add_new_ensemble(self) -> None: after_form_save=self.on_form_save, parent=self.dialog, ) - dialog.open() + self.nested_dialog.open() def on_form_save( self, form_data: dict[str, Any], additional_data: dict[str, Any] @@ -271,9 +272,12 @@ def on_form_save( else: self.model.values.append(values) - # noinspection PyUnresolvedReferences self.model.layoutChanged.emit() + if self.nested_dialog: + self.nested_dialog.close() + self.nested_dialog = None + def sanitise_value( self, value: list[list[int | float]] | None ) -> [list[list[int | float]], str | None]: diff --git a/pywr_editor/schematic/shapes/shape_dialogs.py b/pywr_editor/schematic/shapes/shape_dialogs.py index 3dd4c42f..a9d17488 100644 --- a/pywr_editor/schematic/shapes/shape_dialogs.py +++ b/pywr_editor/schematic/shapes/shape_dialogs.py @@ -143,3 +143,5 @@ def save(self) -> None: app = self.dialog.app app.schematic.reload() app.statusBar().showMessage("Updated shape") + + self.close()