Source code for spinetoolbox.project_items.exporter.widgets.parameter_index_settings_window

######################################################################################################################
# Copyright (C) 2017-2019 Spine project consortium
# This file is part of Spine Toolbox.
# Spine Toolbox is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General
# Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option)
# any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
# Public License for more details. You should have received a copy of the GNU Lesser General Public License along with
# this program. If not, see <http://www.gnu.org/licenses/>.
######################################################################################################################

"""
Parameter indexing settings window for .gdx export.

:author: A. Soininen (VTT)
:date:   25.11.2019
"""

from PySide2.QtCore import Qt, Signal, Slot
from PySide2.QtWidgets import QMessageBox, QWidget
from .parameter_index_settings import IndexSettingsState, ParameterIndexSettings


[docs]class ParameterIndexSettingsWindow(QWidget): """A window which shows a list of ParameterIndexSettings widgets, one for each parameter with indexed values."""
[docs] settings_approved = Signal()
"""Emitted when the settings have been approved."""
[docs] settings_rejected = Signal()
"""Emitted when the settings have been rejected.""" def __init__(self, indexing_settings, available_existing_domains, new_domains, database_path, parent): """ Args: indexing_settings (dict): a map from parameter name to IndexingSettings available_existing_domains (dict): a map from existing domain names to lists of record keys new_domains (dict): a map from new domain names to lists of record keys database_path (str): a database url parent (QWidget): a parent widget """ from ..ui.parameter_index_settings_window import Ui_Form super().__init__(parent, f=Qt.Window) self._available_existing_domains = dict(available_existing_domains) self._indexing_settings = indexing_settings self._new_domains = list() self._ui = Ui_Form() self._ui.setupUi(self) self.setWindowTitle("Gdx Parameter Indexing Settings -- {} --".format(database_path)) self.setAttribute(Qt.WA_DeleteOnClose, True) self._ui.button_box.accepted.connect(self._collect_and_hide) self._ui.button_box.rejected.connect(self._reject_and_close) self._settings_widgets = dict() for parameter_name, indexing_setting in indexing_settings.items(): settings_widget = ParameterIndexSettings( parameter_name, indexing_setting, self._available_existing_domains, new_domains, self._ui.settings_area_contents, ) self._ui.settings_area_layout.insertWidget(0, settings_widget) self._settings_widgets[parameter_name] = settings_widget if not indexing_settings: self._ui.widget_stack.setCurrentIndex(1) return self._ui.widget_stack.setCurrentIndex(0) @property
[docs] def indexing_settings(self): """indexing settings dictionary""" return self._indexing_settings
@property
[docs] def new_domains(self): """list of additional domains needed for indexing""" return self._new_domains
@Slot(str, list)
[docs] def reorder_indexes(self, domain_name, first, last, target): for widget in self._settings_widgets.values(): if widget.is_using_domain(domain_name): widget.reorder_indexes(first, last, target)
@Slot()
[docs] def _collect_and_hide(self): """Collects settings from individual ParameterIndexSettings widgets and hides the window.""" for parameter_name, settings_widget in self._settings_widgets.items(): if settings_widget.state != IndexSettingsState.OK: self._ui.settings_area.ensureWidgetVisible(settings_widget) message = "Parameter '{}' indexing not well-defined.".format(parameter_name) QMessageBox.warning(self, "Bad Parameter Indexing", message) return if settings_widget.new_domain_name in self._available_existing_domains: self._ui.settings_area.ensureWidgetVisible(settings_widget) settings_widget.state = IndexSettingsState.DOMAIN_NAME_CLASH message = "Parameter '{}' indexing domain name already exists.".format(parameter_name) QMessageBox.warning(self, "Domain Name Clash", message) return self._new_domains.clear() for parameter_name, settings_widget in self._settings_widgets.items(): indexing_domain, new_domain = settings_widget.indexing_domain() self._indexing_settings[parameter_name].indexing_domain = indexing_domain if new_domain is not None: self._new_domains.append(new_domain) self.settings_approved.emit() self.hide()
@Slot()
[docs] def _reject_and_close(self): self.close()
[docs] def closeEvent(self, event): super().closeEvent(event) self.settings_rejected.emit()