Source code for bci_framework.framework.config_manager
"""
=====================
Configuration Manager
=====================
"""
import os
from configparser import ConfigParser
from typing import Optional, Dict, TypeVar, Callable
from PySide2 import QtWidgets
WIDGET = TypeVar('QWidget')
########################################################################
[docs]class ConfigManager(ConfigParser):
"""File based configurations manager."""
# ----------------------------------------------------------------------
def __init__(self, filename='.bciframework'):
""""""
super().__init__()
if os.path.isabs(filename):
self.filename = filename
else:
user_dir = os.path.join(os.getenv('BCISTREAM_HOME'))
os.makedirs(user_dir, exist_ok=True)
self.filename = os.path.join(user_dir, filename)
self.load()
# ----------------------------------------------------------------------
[docs] def load(self) -> None:
"""Load the filename with configirations."""
assert os.path.exists(
self.filename), f'"{self.filename} does not exist!"'
self.read(self.filename)
# ----------------------------------------------------------------------
[docs] def set(self, section: str, option: str, value: Optional[str] = '', save: Optional[bool] = False) -> None:
"""Write and save configuration option."""
if not self.has_section(section):
self.add_section(section)
super().set(section, option, value)
if save:
self.save()
# ----------------------------------------------------------------------
[docs] def get(self, section: str, option: str, default: Optional[str] = None, *args, **kwargs) -> None:
"""Read a configuration value, if not exists then save the default."""
if self.has_option(section, option):
return super().get(section, option, *args, **kwargs)
else:
self.set(section, option, default)
return default
# ----------------------------------------------------------------------
[docs] def save(self) -> None:
"""Save configurations."""
with open(self.filename, 'w') as configfile:
self.write(configfile)
# ----------------------------------------------------------------------
[docs] def save_widgets(self, section: str, config: Dict[str, WIDGET]) -> None:
"""Automatically save values from widgets."""
for option in config:
widget = config[option]
# QComboBox
if isinstance(widget, QtWidgets.QComboBox):
self.set(section, option, widget.currentText())
# QCheckBox
elif isinstance(widget, QtWidgets.QCheckBox):
self.set(section, option, str(widget.isChecked()))
# QSpinBox
elif isinstance(widget, QtWidgets.QSpinBox):
self.set(section, option, str(widget.value()))
else:
widget
self.save()
# ----------------------------------------------------------------------
[docs] def load_widgets(self, section: str, config: Dict[str, WIDGET]) -> None:
"""Automatically load values from configurations and set them in widgets."""
for option in config:
widget = config[option]
if not (self.has_section(section) and self.has_option(section, option)):
return
# QComboBox
if isinstance(widget, QtWidgets.QComboBox):
widget.setCurrentText(self.get(section, option))
# QCheckBox
elif isinstance(widget, QtWidgets.QCheckBox):
widget.setChecked(self.getboolean(section, option))
# QSpinBox
elif isinstance(widget, QtWidgets.QSpinBox):
widget.setValue(int(self.get(section, option)))
else:
widget
# ----------------------------------------------------------------------
[docs] def connect_widgets(self, method: Callable, config: Dict[str, WIDGET]) -> None:
"""Automatically connect widgets with events."""
for option in config:
widget = config[option]
# QComboBox
if isinstance(widget, QtWidgets.QComboBox):
widget.activated.connect(method)
# QCheckBox
elif isinstance(widget, QtWidgets.QCheckBox):
widget.clicked.connect(method)
# QSpinBox
elif isinstance(widget, QtWidgets.QSpinBox):
widget.valueChanged.connect(method)
else:
widget