Skip to content
Snippets Groups Projects
Commit fabc86f0 authored by Christoph Schmidt's avatar Christoph Schmidt
Browse files

Updated to Version 1.1.3. Updated some examples and ConfigNode implementations.

parent b4ff0bf5
Branches
No related tags found
No related merge requests found
import logging
import sys
from pathlib import Path
sys.path.append('../src/')
import confighandler as cfg
from confighandler.controller.SelectableList import SelectableList
from LaserConfig import LaserConfig
class ApplicationConfig(cfg.ConfigNode):
def __init__(self, internal_log=True, internal_log_level= logging.DEBUG) -> None:
super().__init__(internal_log=internal_log, internal_log_level=internal_log_level)
# self.output_directory: cfg.Field[Path] = cfg.Field(Path("C:\\{wafer_list1}"))
#
# self.wafer_version: cfg.Field[str] = cfg.Field("v1.0",
# friendly_name="wafer_version",
# description="The version of the wafer")
#
# self.wafer_number: cfg.Field[int] = cfg.Field(1,
# friendly_name="wafer_number",
# description="The version of the wafer")
#
# self.check: cfg.Field[bool] = cfg.Field(False, friendly_name="testcheck",
# description="Testcheck")
#
#
# self.wafer_nr: cfg.Field[str] = cfg.Field("12345ABCD_{wafer_number}",
# friendly_name="wafer_nr",
# description="The version of the wafer")
#
# self.wafer_number2: cfg.Field[tuple] = cfg.Field((1, 2),
# friendly_name="wafer_number2",
# description="The version of the wafer")
#
# self.wafer_list: cfg.Field[list] = cfg.Field([1, 2],
# friendly_name="wafer_list",
# description="The version of the wafer")
self.wafer_list1: cfg.Field[list] = cfg.Field(SelectableList(
[6, 7, 8],
selected_index=0,
description='ms'
),
friendly_name="wafer_list1",
description="The version of the wafer")
# self.laser_config: LaserConfig = LaserConfig(internal_log=internal_log,
# internal_log_level=internal_log_level)
self.register()
import confighandler as cfg
class LaserConfig(cfg.ConfigNode):
def __init__(self, internal_log, internal_log_level) -> None:
super().__init__(internal_log=internal_log, internal_log_level=internal_log_level)
self.wavelength_range = cfg.Field(850)
self.velocity = cfg.Field(2.0)
self.acceleration = cfg.Field(1.0)
self.deceleration = cfg.Field(1.0)
self.port = cfg.Field("USB 0")
self.register()
import logging
import sys
import time
from PySide6 import QtWidgets
from PySide6.QtCore import Signal, QObject
from PySide6.QtWidgets import QApplication, QMainWindow, QWidget, QTreeWidget
from rich.logging import RichHandler
from ApplicationConfig import ApplicationConfig
class TestClass:
def _decorator(foo):
def magic(self):
print("start magic")
foo(self)
print("end magic")
return magic
def __init__(self, config: ApplicationConfig):
self.config = config
self._wafer = 0
@property
def wafer(self):
return self._wafer
@wafer.setter
def wafer(self, value):
self._wafer = value
self.config.wafer_list1.set(value)
print("Wafer changed to", value)
#self.signal.emit(value)
def test(*args, **kwargs):
print(f"test: {args}, {kwargs}")
if __name__ == "__main__":
app = QApplication(sys.argv)
# setup the logging module
config = ApplicationConfig()
testclass = TestClass(config)
time.sleep(1)
#config.autosave(enable=True, path='./configs_autosave')
config.load('./configs/ApplicationConfig.yaml')
config.autosave(enable=True, path='./')
#print(config.wafer_version)
#config.wafer_version.get()
#config.wafer_number.get()
#print(config.wafer_version)
window = QMainWindow()
wdg = QWidget()
grd = QtWidgets.QGridLayout()
wdg.setLayout(grd)
grd.addWidget(config.view.widget(), 0, 0)
#grd.addWidget(config.view.widget(), 1, 0)
tree = QTreeWidget()
tree.setColumnCount(3)
tree.setHeaderLabels(["Name", "Type", "asdf"])
tree.addTopLevelItem(config.view.ui_tree_widget_item(tree))
grd.addWidget(tree, 2, 0)
btn_set = QtWidgets.QPushButton("Set Wafer Number to 123")
btn_set.clicked.connect(lambda: config.wafer_nr.set("123"))
grd.addWidget(btn_set, 3, 0)
btn_save = QtWidgets.QPushButton("Save Config")
btn_save.clicked.connect(lambda: config.save('./configs/ApplicationConfig.yaml'))
grd.addWidget(btn_save, 4, 0)
# Add a new combo box
combo = QtWidgets.QComboBox()
grd.addWidget(combo, 5, 0)
config.wafer_list1.view.add_new_view(combo)
config.wafer_list1.connect(test)
window.setCentralWidget(wdg)
#print(config.load('config.yaml'))
window.show()
sys.exit(app.exec())
# config.wafer_nr = "1234"
# config.save("test.yaml")
...@@ -3,13 +3,14 @@ import sys ...@@ -3,13 +3,14 @@ import sys
import time import time
from PySide6 import QtWidgets from PySide6 import QtWidgets
from PySide6.QtCore import Signal
from PySide6.QtWidgets import QApplication, QMainWindow, QWidget, QTreeWidget from PySide6.QtWidgets import QApplication, QMainWindow, QWidget, QTreeWidget
from rich.logging import RichHandler from rich.logging import RichHandler
from ApplicationConfig import ApplicationConfig from ApplicationConfig import ApplicationConfig
class TestClass: class TestClass:
signal = Signal(int)
def __init__(self): def __init__(self):
self._wafer = 0 self._wafer = 0
...@@ -21,6 +22,7 @@ class TestClass: ...@@ -21,6 +22,7 @@ class TestClass:
def wafer(self, value): def wafer(self, value):
self._wafer = value self._wafer = value
print("Wafer changed to", value) print("Wafer changed to", value)
self.signal.emit(value)
if __name__ == "__main__": if __name__ == "__main__":
...@@ -65,6 +67,8 @@ if __name__ == "__main__": ...@@ -65,6 +67,8 @@ if __name__ == "__main__":
combo = QtWidgets.QComboBox() combo = QtWidgets.QComboBox()
grd.addWidget(combo, 5, 0) grd.addWidget(combo, 5, 0)
config.wafer_list1.view.add_new_view(combo) config.wafer_list1.view.add_new_view(combo)
config.wafer_list1.connect_property(testclass, TestClass.wafer) config.wafer_list1.connect_property(testclass, TestClass.wafer)
window.setCentralWidget(wdg) window.setCentralWidget(wdg)
......
...@@ -12,7 +12,7 @@ class CSignal: ...@@ -12,7 +12,7 @@ class CSignal:
def emit(self, *args, **kwargs): def emit(self, *args, **kwargs):
for connection in self.connections: for connection in self.connections:
connection() connection(*args, **kwargs)
def connect(self, func: callable): def connect(self, func: callable):
self.connections.append(func) self.connections.append(func)
...@@ -191,7 +191,7 @@ class ConfigNode(CObject): ...@@ -191,7 +191,7 @@ class ConfigNode(CObject):
# ================================================================================================================== # ==================================================================================================================
# Functions that happens on a change # Functions that happens on a change
# ================================================================================================================== # ==================================================================================================================
def _on_field_changed(self): def _on_field_changed(self, *args, **kwargs):
# Emit that a field has changed, thus the keywords have changed # Emit that a field has changed, thus the keywords have changed
# print(f"Field changed {self.keywords}") # print(f"Field changed {self.keywords}")
for attr, val in self.fields.items(): for attr, val in self.fields.items():
......
...@@ -11,6 +11,8 @@ import re ...@@ -11,6 +11,8 @@ import re
from pathlib import Path from pathlib import Path
from typing import Generic, T, TypeVar from typing import Generic, T, TypeVar
from PySide6.QtCore import Signal
import confighandler import confighandler
from confighandler.controller.CObject import CObject from confighandler.controller.CObject import CObject
from confighandler.controller.CSignal import CSignal from confighandler.controller.CSignal import CSignal
...@@ -23,12 +25,12 @@ class FieldData(object): ...@@ -23,12 +25,12 @@ class FieldData(object):
self.value = [value, friendly_name, description] self.value = [value, friendly_name, description]
T = TypeVar('T') T = TypeVar('T')
class Field(Generic[T], CObject): class Field(Generic[T], CObject):
changed = CSignal()
def __init__(self, value: T, friendly_name: str = None, description: str = None, def __init__(self, value: T, friendly_name: str = None, description: str = None,
internal_log=True, internal_log_level=logging.INFO): internal_log=True, internal_log_level=logging.INFO):
super().__init__() super().__init__()
...@@ -88,8 +90,13 @@ class Field(Generic[T], CObject): ...@@ -88,8 +90,13 @@ class Field(Generic[T], CObject):
self.props.append((instance, prop)) self.props.append((instance, prop))
def _set_all_props(self, value): def _set_all_props(self, value):
# deactivate the set function since this can trigger an infinite loop
bset = self.set
self.set = lambda *args, **kwargs: None
for inst, prop in self.props: for inst, prop in self.props:
prop.fset(inst, value) prop.fset(inst, value)
# Reactive the set function
self.set = bset
# ================================================================================================================== # ==================================================================================================================
# Register the field to a configuration # Register the field to a configuration
...@@ -104,7 +111,6 @@ class Field(Generic[T], CObject): ...@@ -104,7 +111,6 @@ class Field(Generic[T], CObject):
:param csig_field_changed: The signal that is emitted when the keywords are changed :param csig_field_changed: The signal that is emitted when the keywords are changed
""" """
self.name = name self.name = name
self.owner = owner self.owner = owner
formatter = logging.Formatter(f'%(name)s [{self.name}] %(message)s') formatter = logging.Formatter(f'%(name)s [{self.name}] %(message)s')
...@@ -186,8 +192,12 @@ class Field(Generic[T], CObject): ...@@ -186,8 +192,12 @@ class Field(Generic[T], CObject):
self.set_keywords() self.set_keywords()
# self.view.value_changed.emit(self.value) # self.view.value_changed.emit(self.value)
# This emits a function that notifies the owner that the field has been set # This emits a function that notifies the owner that the field has been set
self.changed.emit(value)
self.csig_field_changed.emit() self.csig_field_changed.emit()
def connect(self, func):
self.changed.connect(func)
# ================================================================================================================== # ==================================================================================================================
# Things that should happen when the value is changed # Things that should happen when the value is changed
# ================================================================================================================== # ==================================================================================================================
...@@ -209,4 +219,3 @@ class Field(Generic[T], CObject): ...@@ -209,4 +219,3 @@ class Field(Generic[T], CObject):
def __repr__(self): def __repr__(self):
return str(f"{self.__class__.__name__}") return str(f"{self.__class__.__name__}")
...@@ -8,7 +8,7 @@ Description: ...@@ -8,7 +8,7 @@ Description:
from PySide6 import QtWidgets from PySide6 import QtWidgets
from PySide6.QtCore import Signal from PySide6.QtCore import Signal
from PySide6.QtWidgets import QWidget, QLineEdit from PySide6.QtWidgets import QWidget, QLineEdit, QComboBox
from confighandler.view.FieldView import FieldView from confighandler.view.FieldView import FieldView
...@@ -17,24 +17,27 @@ class FieldViewList(FieldView): ...@@ -17,24 +17,27 @@ class FieldViewList(FieldView):
value_changed = Signal(tuple) value_changed = Signal(tuple)
def __init__(self, parent_field: 'FieldTuple'): def __init__(self, parent_field: 'FieldList'):
super().__init__(parent_field) super().__init__(parent_field)
def ui_field(self, view: QLineEdit = None) -> QLineEdit: def ui_field(self, view: QLineEdit | QComboBox = None) -> QLineEdit:
""" """
""" """
if view is None: if view is None:
le = QLineEdit(str(self.parent_field.value)) le = QLineEdit(str(self.parent_field.value))
else:
le: QLineEdit = view
le.setToolTip(f"({self.parent_field.name}) {self.parent_field._description}") le.setToolTip(f"({self.parent_field.name}) {self.parent_field._description}")
if isinstance(view, QLineEdit):
le: QLineEdit = view
self.ui_edit_fields.append(le) self.ui_edit_fields.append(le)
self.ui_edit_fields[-1].textEdited.connect(self._on_text_edited) self.ui_edit_fields[-1].textEdited.connect(self._on_text_edited)
# self.ui_edit_fields[-1] : QtWidgets.QLineEdit # self.ui_edit_fields[-1] : QtWidgets.QLineEdit
self.ui_edit_fields[-1].editingFinished.connect(self._on_edited_finished) self.ui_edit_fields[-1].editingFinished.connect(self._on_edited_finished)
# new # new
return self.ui_edit_fields[-1] return self.ui_edit_fields[-1]
elif isinstance(view, QComboBox):
cb: QComboBox = view
def _on_text_edited(self, value): def _on_text_edited(self, value):
self.parent_field.set(value) self.parent_field.set(value)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment