using CommunityToolkit.Mvvm.ComponentModel; using MahApps.Metro.Controls; using System.Collections.ObjectModel; using System.Diagnostics; using System.Windows; using TwinCAT.Ads.TypeSystem; using TwinCAT.TypeSystem; using Heisig.HMI.AdsManager; namespace UniperHMI { public partial class SettingsEntry : ObservableObject { [ObservableProperty] private string name = ""; [ObservableProperty] private string instancePath = ""; [ObservableProperty] private string? dataType; [ObservableProperty] private Object? value; public ObservableCollection SubEntries { get; set; } = []; [ObservableProperty] private Visibility visibility = Visibility.Collapsed; private readonly IAdsManager _adsManager; public SettingsEntry(IAdsManager adsManager) { _adsManager = adsManager; } partial void OnValueChanging(object? oldValue, object? newValue) { if (newValue == null) { newValue = oldValue; return; } try { _adsManager.WriteValue(InstancePath, newValue); } catch (Exception) { newValue = oldValue; Debug.WriteLine("Value {0} could not be written to {1}", newValue, InstancePath); } } } public partial class SettingsPageVM : ObservableObject, IDisposable { public ObservableCollection RootItem { get; private set; } = []; private readonly IAdsManager _adsManager; private readonly string _variableName; public SettingsPageVM(IAdsManager adsManager, string variableName) { _adsManager = adsManager; _variableName = variableName; _adsManager.Register(_variableName, ConfigChangedEvent); } private void ConfigChangedEvent(object? sender, ValueChangedEventArgs e) { App.Current.Invoke(CreateSettingsTree); } private void CreateSettingsTree() { ISymbolLoader? symbolLoader = _adsManager.GetSymbolLoader(); if (symbolLoader == null) return; Symbol configSymbol = (Symbol)symbolLoader.Symbols[_variableName]; SettingsEntry entry = GetSymbol(configSymbol); RootItem.Add(entry); } private SettingsEntry GetSymbol(Symbol symbol) { // Create Symbol SettingsEntry entry = new(_adsManager) { Name = symbol.InstanceName, InstancePath = symbol.InstancePath, DataType = symbol.DataType?.Name }; // Check if symbol has sub symbols if (!symbol.IsPrimitiveType) { foreach (Symbol subSymbol in symbol.SubSymbols.Cast()) { entry.SubEntries.Add(GetSymbol(subSymbol)); } } else { entry.Visibility = Visibility.Visible; entry.Value = symbol.ReadValue(); } return entry; } public void Dispose() { _adsManager?.Deregister(_variableName, ConfigChangedEvent); } } }