Du hast auf den Branch log-test-branch 2026-04-12 20:57:35 +00:00 gepusht
Neuer Pull-Request
Du hast auf den Branch anon-test2 2026-04-12 20:50:35 +00:00 gepusht
Neuer Pull-Request
Dateien
Soft-LTS/ViewModels/SettingsViewModel.cs
2026-04-12 17:39:45 +02:00

188 Zeilen
5.7 KiB
C#

using System.Collections.ObjectModel;
using System.IO;
using System.Text.Json;
using System.Text.Json.Nodes;
using System.Windows;
using System.Windows.Input;
using PrinterMonitor.Configuration;
namespace PrinterMonitor.ViewModels;
public class SettingsViewModel : ViewModelBase
{
private readonly AppSettings _settings;
public ObservableCollection<PrinterConfig> Printers { get; }
// Globale Einstellungen
private int _tcpTargetPort;
public int TcpTargetPort { get => _tcpTargetPort; set => SetProperty(ref _tcpTargetPort, value); }
private PrinterConfig? _selectedPrinter;
public PrinterConfig? SelectedPrinter
{
get => _selectedPrinter;
set
{
if (_selectedPrinter != null)
ApplyEdits();
if (SetProperty(ref _selectedPrinter, value))
{
LoadEdits();
OnPropertyChanged(nameof(HasSelection));
OnPropertyChanged(nameof(IsNetworkPrinter));
}
}
}
public bool HasSelection => _selectedPrinter != null;
public bool IsNetworkPrinter => _selectedPrinter != null &&
!string.Equals(_selectedPrinter.Type, "Simulation", StringComparison.OrdinalIgnoreCase);
// Edit-Felder
private string _editName = "";
private string _editType = "CabSquix";
private string _editHost = "";
private int _editPort;
private bool _editEnabled = true;
public string EditName { get => _editName; set => SetProperty(ref _editName, value); }
public string EditType
{
get => _editType;
set
{
if (SetProperty(ref _editType, value))
OnPropertyChanged(nameof(IsNetworkPrinter));
}
}
public string EditHost { get => _editHost; set => SetProperty(ref _editHost, value); }
public int EditPort { get => _editPort; set => SetProperty(ref _editPort, value); }
public bool EditEnabled { get => _editEnabled; set => SetProperty(ref _editEnabled, value); }
public IReadOnlyList<string> PrinterTypes { get; } =
new[] { "CabSquix", "Zebra", "Honeywell", "Simulation" };
public ICommand AddCommand { get; }
public ICommand RemoveCommand { get; }
public ICommand SaveCommand { get; }
private readonly Func<Task> _onSaved;
public SettingsViewModel(AppSettings settings, Func<Task> onSaved)
{
_settings = settings;
_onSaved = onSaved;
Printers = new ObservableCollection<PrinterConfig>(settings.Printers);
TcpTargetPort = settings.TcpTargetPort;
AddCommand = new RelayCommand(AddPrinter);
RemoveCommand = new RelayCommand(RemovePrinter, () => HasSelection);
SaveCommand = new AsyncRelayCommand(SaveAsync);
}
private void AddPrinter()
{
var newPrinter = new PrinterConfig
{
Name = "Neuer Drucker",
Type = "CabSquix",
Host = "",
Port = 4840,
Enabled = true
};
Printers.Add(newPrinter);
SelectedPrinter = newPrinter;
}
private void RemovePrinter()
{
if (_selectedPrinter == null) return;
var idx = Printers.IndexOf(_selectedPrinter);
Printers.Remove(_selectedPrinter);
_selectedPrinter = null;
LoadEdits();
OnPropertyChanged(nameof(HasSelection));
OnPropertyChanged(nameof(SelectedPrinter));
if (Printers.Count > 0)
SelectedPrinter = Printers[Math.Min(idx, Printers.Count - 1)];
}
private async Task SaveAsync()
{
if (_selectedPrinter != null)
ApplyEdits();
try
{
var configPath = Path.Combine(AppContext.BaseDirectory, "appsettings.json");
var jsonOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = true
};
JsonNode? root = null;
if (File.Exists(configPath))
{
var existing = await File.ReadAllTextAsync(configPath);
root = JsonNode.Parse(existing);
}
root ??= new JsonObject();
root["tcpTargetPort"] = TcpTargetPort;
root["printers"] = JsonSerializer.SerializeToNode(Printers.ToList(), jsonOptions);
await File.WriteAllTextAsync(configPath,
root.ToJsonString(new JsonSerializerOptions { WriteIndented = true }));
_settings.TcpTargetPort = TcpTargetPort;
_settings.Printers = Printers.ToList();
await _onSaved();
MessageBox.Show("Einstellungen gespeichert. Monitoring wurde neu gestartet.",
"Gespeichert", MessageBoxButton.OK, MessageBoxImage.Information);
}
catch (Exception ex)
{
MessageBox.Show($"Fehler beim Speichern:\n{ex.Message}",
"Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void LoadEdits()
{
if (_selectedPrinter == null)
{
EditName = "";
EditType = "CabSquix";
EditHost = "";
EditPort = 0;
EditEnabled = true;
return;
}
EditName = _selectedPrinter.Name;
EditType = _selectedPrinter.Type;
EditHost = _selectedPrinter.Host;
EditPort = _selectedPrinter.Port;
EditEnabled = _selectedPrinter.Enabled;
}
private void ApplyEdits()
{
if (_selectedPrinter == null) return;
_selectedPrinter.Name = EditName;
_selectedPrinter.Type = EditType;
_selectedPrinter.Host = EditHost;
_selectedPrinter.Port = EditPort;
_selectedPrinter.Enabled = EditEnabled;
}
}