Source code for qudi.core.gui.main_gui.configwidget

# -*- coding: utf-8 -*-

"""
This module contains the QTreeWidget object to display qudi configurations.

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__ = ['ConfigQTreeWidget']

from typing import Any, Mapping
from collections.abc import Sequence as AbstractSequence
from collections.abc import Mapping as AbstractMapping
from PySide2 import QtWidgets


[docs] class ConfigQTreeWidget(QtWidgets.QTreeWidget): """Specialized QTreeWidget to display qudi configurations. """ def set_config(self, config: Mapping[str, Any]) -> None: self.clear() self._insert_value(self.invisibleRootItem(), config) def _insert_value(self, root: QtWidgets.QTreeWidgetItem, value: Any) -> None: """Recursively fill the QTreeWidgeItem. """ # if value is a mapping, open up a new sub-tree and recursively fill it if isinstance(value, AbstractMapping): if len(value) == 0: root.setText(0, f'{root.text(0)} {{}}') else: for key, val in value.items(): child = QtWidgets.QTreeWidgetItem() child.setText(0, f'{key}:') root.addChild(child) self._insert_value(child, val) root.setExpanded(True) # if value is any string (or similar) type, e.g. str, bytes, bytearray, just add it to root elif isinstance(value, (str, bytearray, bytes)): try: text = value.decode('utf8') except (UnicodeDecodeError, AttributeError): text = str(value) root.setText(0, f'{root.text(0)} "{text}"') # If the value is a sequence of values itself, open up a new sub-tree and fill it elif isinstance(value, AbstractSequence): if len(value) == 0: root.setText(0, f'{root.text(0)} []') else: for val in value: child = QtWidgets.QTreeWidgetItem() child.setText(0, '-') root.addChild(child) self._insert_value(child, val) root.setExpanded(True) # If the value is anything else, just convert to str else: root.setText(0, f'{root.text(0)} {str(value)}')