Source code for qudi.tools.config_editor.module_editor
# -*- coding: utf-8 -*-
"""
QWidget serving as main editor for the individual module config sections
.. Copyright (c) 2021, the qudi developers. See the AUTHORS.md file at the top-level directory of this
.. distribution and on <https://github.com/Ulm-IQO/qudi-core/>
..
.. This file is part of qudi.
..
.. Qudi 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.
..
.. Qudi 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 qudi.
.. If not, see <https://www.gnu.org/licenses/>.
"""
__all__ = ['ModuleEditorWidget']
from PySide2 import QtCore, QtWidgets
from typing import Optional, Mapping, Dict, Union, Any
from qudi.util.widgets.separator_lines import HorizontalLine
from qudi.tools.config_editor.module_finder import QudiModules
from qudi.tools.config_editor.module_widgets import LocalModuleConfigWidget
from qudi.tools.config_editor.module_widgets import RemoteModuleConfigWidget
[docs]
class ModuleEditorWidget(QtWidgets.QStackedWidget):
""" """
sigModuleRenamed = QtCore.Signal(str)
[docs]
def __init__(
self, qudi_modules: QudiModules, parent: Optional[QtWidgets.QWidget] = None
) -> None:
super().__init__(parent=parent)
self.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
assert isinstance(qudi_modules, QudiModules)
self._qudi_modules = qudi_modules
self.placeholder_label = QtWidgets.QLabel(
'Please select a module to configure from the tree view.'
)
font = self.placeholder_label.font()
font.setBold(True)
font.setPointSize(font.pointSize() + 4)
self.placeholder_label.setFont(font)
self.placeholder_label.setAlignment(QtCore.Qt.AlignCenter)
self.placeholder_label.setSizePolicy(
QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding
)
self.addWidget(self.placeholder_label)
self._editor_layout = QtWidgets.QVBoxLayout()
self._editor_layout.setStretch(2, 1)
# Module name editor
sub_layout = QtWidgets.QHBoxLayout()
sub_layout.setStretch(1, 1)
label = QtWidgets.QLabel('* Module Name:')
label.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
self.module_name_lineedit = QtWidgets.QLineEdit()
self.module_name_lineedit.setPlaceholderText('Enter locally unique module name')
self.module_name_lineedit.setFont(font)
self.module_name_lineedit.textChanged.connect(self.sigModuleRenamed)
sub_layout.addWidget(label)
sub_layout.addWidget(self.module_name_lineedit)
self._editor_layout.addLayout(sub_layout)
# Add separator
self._editor_layout.addWidget(HorizontalLine())
editor_widget = QtWidgets.QWidget()
editor_widget.setLayout(self._editor_layout)
self.addWidget(editor_widget)
self._current_editor = None
@property
def config(self) -> Union[None, Dict[str, Any]]:
try:
return self._current_editor.config
except AttributeError:
return None
[docs]
def set_config(self, config: Union[None, Dict[str, Any]]) -> None:
try:
self._current_editor.set_config(config)
except AttributeError:
pass
@property
def module_name(self) -> str:
return self.module_name_lineedit.text()
[docs]
def set_module_name(self, name: str) -> None:
self.module_name_lineedit.blockSignals(True)
try:
self.module_name_lineedit.setText(name)
finally:
self.module_name_lineedit.blockSignals(False)
[docs]
def open_remote_module(
self,
name: Optional[str] = None,
config: Optional[Mapping[str, Union[str, None]]] = None,
) -> None:
if self._current_editor is not None:
self.close_editor()
self._current_editor = RemoteModuleConfigWidget(config=config)
self._editor_layout.addWidget(self._current_editor)
self.set_module_name(name if name else '')
self.setCurrentIndex(1)
[docs]
def open_local_module(
self,
module_class: str,
named_modules: Mapping[str, str],
name: Optional[str] = None,
config: Optional[
Dict[str, Union[str, bool, Dict[str, str], Dict[str, Any]]]
] = None,
) -> None:
if self._current_editor is not None:
self.close_editor()
connectors = self._qudi_modules.module_connectors(module_class)
config_options = self._qudi_modules.module_config_options(module_class)
valid_connector_targets = self._qudi_modules.module_connector_targets(
module_class
)
self._current_editor = LocalModuleConfigWidget(
module_class=module_class,
config_options=config_options,
connectors=connectors,
valid_connector_targets=valid_connector_targets,
named_modules=named_modules,
config=config,
)
self._editor_layout.addWidget(self._current_editor)
self.set_module_name(name if name else '')
self.setCurrentIndex(1)
[docs]
def close_editor(self):
if self._current_editor is None:
return
self.setCurrentIndex(0)
self._editor_layout.removeWidget(self._current_editor)
self._current_editor.setParent(None)
self._current_editor.deleteLater()
self._current_editor = None