using Avalonia; using Avalonia.Controls; using Avalonia.Markup.Xaml; using Microsoft.Extensions.DependencyInjection; using hass_workstation_service.Communication.NamedPipe; using JKang.IpcServiceFramework.Client; using System.Threading.Tasks; using Avalonia.Interactivity; using System.Reactive.Linq; using UserInterface.ViewModels; using System.Security; using hass_workstation_service.Communication.InterProcesCommunication.Models; using System.Collections.Generic; using System.Linq; using Avalonia.Controls.ApplicationLifetimes; namespace UserInterface.Views { public class CommandSettings : UserControl { private readonly IIpcClient client; private DataGrid _dataGrid { get; set; } private bool sensorsNeedToRefresh { get; set; } public CommandSettings() { this.InitializeComponent(); // register IPC clients ServiceProvider serviceProvider = new ServiceCollection() .AddNamedPipeIpcClient("commands", pipeName: "pipeinternal") .BuildServiceProvider(); // resolve IPC client factory IIpcClientFactory clientFactory = serviceProvider .GetRequiredService>(); // create client this.client = clientFactory.CreateClient("commands"); DataContext = new CommandSettingsViewModel(); GetConfiguredCommands(); this._dataGrid = this.FindControl("Grid"); } public async void GetConfiguredCommands() { sensorsNeedToRefresh = false; List status = await this.client.InvokeAsync(x => x.GetConfiguredCommands()); ((CommandSettingsViewModel)this.DataContext).ConfiguredCommands = status.Select(s => new CommandViewModel() { Name = s.Name, Type = s.Type, Id = s.Id}).ToList(); } public void Delete(object sender, RoutedEventArgs args) { var item = ((CommandViewModel)this._dataGrid.SelectedItem); this.client.InvokeAsync(x => x.RemoveCommandById(item.Id)); ((CommandSettingsViewModel)this.DataContext).ConfiguredCommands.Remove(item); this._dataGrid.SelectedIndex = -1; ((CommandSettingsViewModel)this.DataContext).TriggerUpdate(); } public async void Add(object sender, RoutedEventArgs args) { AddCommandDialog dialog = new AddCommandDialog(); if (Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { await dialog.ShowDialog(desktop.MainWindow); sensorsNeedToRefresh = true; GetConfiguredCommands(); } } private void InitializeComponent() { AvaloniaXamlLoader.Load(this); } } }