Update views

merge-updating
Stefan Roelofs 4 years ago
parent bdbce79e38
commit dfb671a7ee

@ -5,24 +5,26 @@
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="UserInterface.Views.AddCommandDialog" x:Class="UserInterface.Views.AddCommandDialog"
SizeToContent="WidthAndHeight" SizeToContent="WidthAndHeight"
Title="Add command"> Title="Add / edit command">
<StackPanel Margin="40" MinWidth="200"> <StackPanel Margin="40" MinWidth="200">
<ContentControl Margin="0 20 0 10">Command type</ContentControl> <ContentControl Margin="0 20 0 10">Command type</ContentControl>
<ComboBox x:Name="ComboBox" SelectionChanged="ComboBoxClosed" SelectedItem="{Binding SelectedType}" MinHeight="27"></ComboBox> <ComboBox x:Name="ComboBox" SelectionChanged="ComboBoxClosed" SelectedItem="{Binding SelectedType}" MinHeight="27"></ComboBox>
<TextBlock Margin="0 10 0 10" MaxWidth="300" TextWrapping="Wrap" TextAlignment="Left" Text="{Binding Description}"></TextBlock> <TextBlock Margin="0 10 0 10" MaxWidth="300" TextWrapping="Wrap" TextAlignment="Left" Text="{Binding Description}"></TextBlock>
<Button IsVisible="{Binding MoreInfoLink, Converter={x:Static StringConverters.IsNotNullOrEmpty}}" Click="OpenInfo" Margin="0 10 0 10">Click for more information.</Button> <Button IsVisible="{Binding MoreInfoLink, Converter={x:Static StringConverters.IsNotNullOrEmpty}}" Click="OpenInfo" Margin="0 10 0 10">Click for more information.</Button>
<ContentControl Margin="0 20 0 10">Name</ContentControl> <ContentControl Margin="0 20 0 10">Name</ContentControl>
<TextBox Text="{Binding Name}" HorizontalAlignment="Left" MinWidth="150"/> <TextBox Text="{Binding Name}" HorizontalAlignment="Left" MinWidth="150"/>
<TextBlock Text="{Binding UpdateInterval, StringFormat= Update every {0} seconds}" HorizontalAlignment="Left" MinWidth="150"/> <TextBlock Text="{Binding UpdateInterval, StringFormat= Update every {0} seconds}" HorizontalAlignment="Left" MinWidth="150"/>
<ContentControl IsVisible="{Binding ShowCommandInput}" Margin="0 20 0 10">Command</ContentControl> <ContentControl IsVisible="{Binding ShowCommandInput}" Margin="0 20 0 10">Command</ContentControl>
<TextBox IsVisible="{Binding ShowCommandInput}" Text="{Binding Command}" Watermark="Rundll32.exe user32.dll,LockWorkStation" HorizontalAlignment="Left" MinWidth="300"/> <TextBox IsVisible="{Binding ShowCommandInput}" Text="{Binding Command}" Watermark="Rundll32.exe user32.dll,LockWorkStation" HorizontalAlignment="Left" MinWidth="300"/>
<ContentControl IsVisible="{Binding ShowKeyInput}" Margin="0 20 0 10">Key</ContentControl> <ContentControl IsVisible="{Binding ShowKeyInput}" Margin="0 20 0 10">Key</ContentControl>
<TextBox IsVisible="{Binding ShowKeyInput}" Text="{Binding Key}" Watermark="0xAD" HorizontalAlignment="Left" MinWidth="300"/> <TextBox IsVisible="{Binding ShowKeyInput}" Text="{Binding Key}" Watermark="0xAD" HorizontalAlignment="Left" MinWidth="300"/>
<Button IsVisible="{Binding ShowCommandInput}" Width="75" HorizontalAlignment="Right" Margin="0 40 0 10" Click="Test">Test</Button> <Grid>
<Button Width="75" HorizontalAlignment="Right" Margin="0 40 0 10" Click="Save">Save</Button> <Button IsVisible="{Binding ShowCommandInput}" Width="75" HorizontalAlignment="Left" Margin="0 40 0 10" Click="Test">Test</Button>
</StackPanel> <Button Width="75" HorizontalAlignment="Right" Margin="0 40 0 10" Click="Save">Save</Button>
</Grid>
</StackPanel>
</Window> </Window>

@ -7,7 +7,6 @@ using hass_workstation_service.Communication.NamedPipe;
using JKang.IpcServiceFramework.Client; using JKang.IpcServiceFramework.Client;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using System; using System;
using System.Dynamic;
using System.Linq; using System.Linq;
using System.Text.Json; using System.Text.Json;
using UserInterface.Util; using UserInterface.Util;
@ -17,16 +16,25 @@ namespace UserInterface.Views
{ {
public class AddCommandDialog : Window public class AddCommandDialog : Window
{ {
private readonly IIpcClient<IServiceContractInterfaces> client; private readonly IIpcClient<IServiceContractInterfaces> _client;
public ComboBox comboBox { get; set; } public ComboBox ComboBox { get; set; }
public ComboBox detectionModecomboBox { get; set; } public ComboBox DetectionModecomboBox { get; set; }
public Guid CommandId { get; }
public AddCommandDialog(Guid commandId) : this()
{
CommandId = commandId;
GetCommandInfo(CommandId);
Title = "Edit command";
}
public AddCommandDialog() public AddCommandDialog()
{ {
this.InitializeComponent(); InitializeComponent();
DataContext = new AddCommandViewModel(); DataContext = new AddCommandViewModel();
this.comboBox = this.FindControl<ComboBox>("ComboBox"); ComboBox = this.FindControl<ComboBox>("ComboBox");
this.comboBox.Items = Enum.GetValues(typeof(AvailableCommands)).Cast<AvailableCommands>().OrderBy(v => v.ToString()); ComboBox.Items = Enum.GetValues(typeof(AvailableCommands)).Cast<AvailableCommands>().OrderBy(v => v.ToString());
this.comboBox.SelectedIndex = 0; ComboBox.SelectedIndex = 0;
// register IPC clients // register IPC clients
ServiceProvider serviceProvider = new ServiceCollection() ServiceProvider serviceProvider = new ServiceCollection()
@ -38,22 +46,53 @@ namespace UserInterface.Views
.GetRequiredService<IIpcClientFactory<IServiceContractInterfaces>>(); .GetRequiredService<IIpcClientFactory<IServiceContractInterfaces>>();
// create client // create client
this.client = clientFactory.CreateClient("addCommand"); _client = clientFactory.CreateClient("addCommand");
Title = "Add sensor";
}
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
private async void GetCommandInfo(Guid commandId)
{
var command = await _client.InvokeAsync(x => x.GetConfiguredCommand(commandId));
ComboBox.SelectedItem = command.Type;
FillDefaultValues();
ComboBox.IsEnabled = false;
var item = (AddCommandViewModel)DataContext;
item.SelectedType = command.Type;
item.Name = command.Name;
//item.UpdateInterval = command.UpdateInterval;
//item.WindowName =
//item.Query =
} }
public async void Save(object sender, RoutedEventArgs args) public async void Save(object sender, RoutedEventArgs args)
{ {
var item = ((AddCommandViewModel)this.DataContext); var item = (AddCommandViewModel)DataContext;
dynamic model = new { item.Name, item.Command, item.Key}; dynamic model = new { item.Name, item.Command, item.Key };
string json = JsonSerializer.Serialize(model); string json = JsonSerializer.Serialize(model);
await this.client.InvokeAsync(x => x.AddCommand(item.SelectedType, json)); if (CommandId == Guid.Empty)
await _client.InvokeAsync(x => x.AddCommand(item.SelectedType, json));
else
await _client.InvokeAsync(x => x.UpdateCommandById(CommandId, json));
Close(); Close();
} }
public void ComboBoxClosed(object sender, SelectionChangedEventArgs args) public void ComboBoxClosed(object sender, SelectionChangedEventArgs args)
{ {
var item = ((AddCommandViewModel)this.DataContext); FillDefaultValues();
switch (this.comboBox.SelectedItem) }
private void FillDefaultValues()
{
var item = (AddCommandViewModel)DataContext;
switch (ComboBox.SelectedItem)
{ {
case AvailableCommands.CustomCommand: case AvailableCommands.CustomCommand:
item.Description = "This command lets you execute any command you want. It will run in a Windows Command Prompt silently. "; item.Description = "This command lets you execute any command you want. It will run in a Windows Command Prompt silently. ";
@ -129,28 +168,26 @@ namespace UserInterface.Views
break; break;
} }
} }
public void OpenInfo(object sender, RoutedEventArgs args) public void OpenInfo(object sender, RoutedEventArgs args)
{ {
var item = ((AddCommandViewModel)this.DataContext); var item = (AddCommandViewModel)DataContext;
BrowserUtil.OpenBrowser(item.MoreInfoLink); BrowserUtil.OpenBrowser(item.MoreInfoLink);
} }
public void Test(object sender, RoutedEventArgs args) public void Test(object sender, RoutedEventArgs args)
{ {
var item = ((AddCommandViewModel)this.DataContext); var item = (AddCommandViewModel)DataContext;
System.Diagnostics.Process process = new System.Diagnostics.Process(); var process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); var startInfo = new System.Diagnostics.ProcessStartInfo
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal; {
startInfo.FileName = "cmd.exe"; WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal,
startInfo.Arguments = $"/k {"echo You won't see this window normally. &&" + item.Command}"; FileName = "cmd.exe",
Arguments = $"/k {"echo You won't see this window normally. &&" + item.Command}"
};
process.StartInfo = startInfo; process.StartInfo = startInfo;
process.Start(); process.Start();
} }
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
} }
} }

@ -5,27 +5,27 @@
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="UserInterface.Views.AddSensorDialog" x:Class="UserInterface.Views.AddSensorDialog"
SizeToContent="WidthAndHeight" SizeToContent="WidthAndHeight"
Title="Add sensor"> Title="Add / edit sensor">
<StackPanel Margin="40" MinWidth="200"> <StackPanel Margin="40" MinWidth="200">
<ContentControl Margin="0 20 0 10">Sensor type</ContentControl> <ContentControl Margin="0 20 0 10">Sensor type</ContentControl>
<ComboBox x:Name="ComboBox" SelectionChanged="ComboBoxClosed" SelectedItem="{Binding SelectedType}" MinHeight="27"></ComboBox> <ComboBox x:Name="ComboBox" SelectionChanged="ComboBoxClosed" SelectedItem="{Binding SelectedType}" MinHeight="27"></ComboBox>
<TextBlock Margin="0 10 0 10" MaxWidth="300" TextWrapping="Wrap" TextAlignment="Left" Text="{Binding Description}"></TextBlock> <TextBlock Margin="0 10 0 10" MaxWidth="300" TextWrapping="Wrap" TextAlignment="Left" Text="{Binding Description}"></TextBlock>
<Button IsVisible="{Binding MoreInfoLink, Converter={x:Static StringConverters.IsNotNullOrEmpty}}" Click="OpenInfo" Margin="0 10 0 10">Click for more information.</Button> <Button IsVisible="{Binding MoreInfoLink, Converter={x:Static StringConverters.IsNotNullOrEmpty}}" Click="OpenInfo" Margin="0 10 0 10">Click for more information.</Button>
<ContentControl Margin="0 20 0 10">Name</ContentControl> <ContentControl Margin="0 20 0 10">Name</ContentControl>
<TextBox Text="{Binding Name}" HorizontalAlignment="Left" MinWidth="150"/> <TextBox Text="{Binding Name}" HorizontalAlignment="Left" MinWidth="150"/>
<ContentControl Margin="0 20 0 10">Update interval</ContentControl> <ContentControl Margin="0 20 0 10">Update interval</ContentControl>
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<Slider Value="{Binding UpdateInterval}" Minimum="1" Maximum="300" HorizontalAlignment="Left" Width="150"/> <Slider Value="{Binding UpdateInterval}" Minimum="1" Maximum="300" HorizontalAlignment="Left" Width="150"/>
<TextBox Text="{Binding UpdateInterval}" HorizontalAlignment="Right" MaxWidth="30"/> <TextBox Text="{Binding UpdateInterval}" HorizontalAlignment="Right" MaxWidth="30"/>
</StackPanel> </StackPanel>
<TextBlock Text="{Binding UpdateInterval, StringFormat= Update every {0} seconds}" HorizontalAlignment="Left" MinWidth="150"/> <TextBlock Text="{Binding UpdateInterval, StringFormat= Update every {0} seconds}" HorizontalAlignment="Left" MinWidth="150"/>
<ContentControl IsVisible="{Binding ShowQueryInput}" Margin="0 20 0 10">Query</ContentControl> <ContentControl IsVisible="{Binding ShowQueryInput}" Margin="0 20 0 10">Query</ContentControl>
<TextBox IsVisible="{Binding ShowQueryInput}" Text="{Binding Query}" Watermark="SELECT Name FROM Win32_Processor" HorizontalAlignment="Left" MinWidth="300"/> <TextBox IsVisible="{Binding ShowQueryInput}" Text="{Binding Query}" Watermark="SELECT Name FROM Win32_Processor" HorizontalAlignment="Left" MinWidth="300"/>
<ContentControl IsVisible="{Binding ShowWindowNameInput}" Margin="0 20 0 5">Window name</ContentControl> <ContentControl IsVisible="{Binding ShowWindowNameInput}" Margin="0 20 0 5">Window name</ContentControl>
<TextBlock TextWrapping="Wrap" MaxWidth="300" FontStyle="Italic" IsVisible="{Binding ShowWindowNameInput}" Margin="0 0 0 10">This is case-insensitive and loosely matched. A window called "Spotify Premium" will match "spotify" or "premium".</TextBlock> <TextBlock TextWrapping="Wrap" MaxWidth="300" FontStyle="Italic" IsVisible="{Binding ShowWindowNameInput}" Margin="0 0 0 10">This is case-insensitive and loosely matched. A window called "Spotify Premium" will match "spotify" or "premium".</TextBlock>
<TextBox IsVisible="{Binding ShowWindowNameInput}" Text="{Binding WindowName}" Watermark="Visual Studio Code" HorizontalAlignment="Left" MinWidth="300"/> <TextBox IsVisible="{Binding ShowWindowNameInput}" Text="{Binding WindowName}" Watermark="Visual Studio Code" HorizontalAlignment="Left" MinWidth="300"/>
<Button Width="75" HorizontalAlignment="Right" Margin="0 40 0 10" Click="Save">Save</Button> <Button Width="75" HorizontalAlignment="Right" Margin="0 40 0 10" Click="Save">Save</Button>
</StackPanel> </StackPanel>
</Window> </Window>

@ -7,7 +7,6 @@ using hass_workstation_service.Communication.NamedPipe;
using JKang.IpcServiceFramework.Client; using JKang.IpcServiceFramework.Client;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using System; using System;
using System.Dynamic;
using System.Linq; using System.Linq;
using System.Text.Json; using System.Text.Json;
using UserInterface.Util; using UserInterface.Util;
@ -17,16 +16,25 @@ namespace UserInterface.Views
{ {
public class AddSensorDialog : Window public class AddSensorDialog : Window
{ {
private readonly IIpcClient<IServiceContractInterfaces> client; private readonly IIpcClient<IServiceContractInterfaces> _client;
public ComboBox comboBox { get; set; } public ComboBox ComboBox { get; set; }
public ComboBox detectionModecomboBox { get; set; } public ComboBox DetectionModecomboBox { get; set; }
public Guid SensorId { get; }
public AddSensorDialog(Guid sensorId) : this()
{
SensorId = sensorId;
GetSensorInfo(SensorId);
Title = "Edit sensor";
}
public AddSensorDialog() public AddSensorDialog()
{ {
this.InitializeComponent(); InitializeComponent();
DataContext = new AddSensorViewModel(); DataContext = new AddSensorViewModel();
this.comboBox = this.FindControl<ComboBox>("ComboBox"); ComboBox = this.FindControl<ComboBox>("ComboBox");
this.comboBox.Items = Enum.GetValues(typeof(AvailableSensors)).Cast<AvailableSensors>().OrderBy(v => v.ToString()); ComboBox.Items = Enum.GetValues(typeof(AvailableSensors)).Cast<AvailableSensors>().OrderBy(v => v.ToString());
this.comboBox.SelectedIndex = 0; ComboBox.SelectedIndex = 0;
// register IPC clients // register IPC clients
ServiceProvider serviceProvider = new ServiceCollection() ServiceProvider serviceProvider = new ServiceCollection()
@ -38,22 +46,52 @@ namespace UserInterface.Views
.GetRequiredService<IIpcClientFactory<IServiceContractInterfaces>>(); .GetRequiredService<IIpcClientFactory<IServiceContractInterfaces>>();
// create client // create client
this.client = clientFactory.CreateClient("addsensor"); _client = clientFactory.CreateClient("addsensor");
Title = "Add sensor";
}
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
private async void GetSensorInfo(Guid sensorId)
{
var sensor = await _client.InvokeAsync(x => x.GetConfiguredSensor(sensorId));
ComboBox.SelectedItem = sensor.Type;
FillDefaultValues();
ComboBox.IsEnabled = false;
var item = (AddSensorViewModel)DataContext;
item.SelectedType = sensor.Type;
item.Name = sensor.Name;
item.UpdateInterval = sensor.UpdateInterval;
//item.WindowName =
//item.Query =
} }
public async void Save(object sender, RoutedEventArgs args) public async void Save(object sender, RoutedEventArgs args)
{ {
var item = ((AddSensorViewModel)this.DataContext); var item = (AddSensorViewModel)DataContext;
dynamic model = new { item.Name, item.Query, item.UpdateInterval, item.WindowName}; dynamic model = new { item.Name, item.Query, item.UpdateInterval, item.WindowName };
string json = JsonSerializer.Serialize(model); string json = JsonSerializer.Serialize(model);
await this.client.InvokeAsync(x => x.AddSensor(item.SelectedType, json)); if (SensorId == Guid.Empty)
await _client.InvokeAsync(x => x.AddSensor(item.SelectedType, json));
else
await _client.InvokeAsync(x => x.UpdateSensorById(SensorId, json));
Close(); Close();
} }
public void ComboBoxClosed(object sender, SelectionChangedEventArgs args) public void ComboBoxClosed(object sender, SelectionChangedEventArgs args)
{ {
var item = ((AddSensorViewModel)this.DataContext); FillDefaultValues();
switch (this.comboBox.SelectedItem) }
private void FillDefaultValues()
{
var item = (AddSensorViewModel)DataContext;
switch (ComboBox.SelectedItem)
{ {
case AvailableSensors.UserNotificationStateSensor: case AvailableSensors.UserNotificationStateSensor:
item.Description = "This sensor watches the UserNotificationState. This is normally used in applications to determine if it is appropriate to send a notification but we can use it to expose this state. \n "; item.Description = "This sensor watches the UserNotificationState. This is normally used in applications to determine if it is appropriate to send a notification but we can use it to expose this state. \n ";
@ -181,15 +219,11 @@ namespace UserInterface.Views
break; break;
} }
} }
public void OpenInfo(object sender, RoutedEventArgs args) public void OpenInfo(object sender, RoutedEventArgs args)
{ {
var item = ((AddSensorViewModel)this.DataContext); var item = (AddSensorViewModel)DataContext;
BrowserUtil.OpenBrowser(item.MoreInfoLink); BrowserUtil.OpenBrowser(item.MoreInfoLink);
} }
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
} }
} }

@ -22,7 +22,7 @@
<TextBlock Grid.Row="2" IsVisible="{Binding !ConfiguredCommands.Count}" Text="Add some commands by clicking the 'Add' button."/> <TextBlock Grid.Row="2" IsVisible="{Binding !ConfiguredCommands.Count}" Text="Add some commands by clicking the 'Add' button."/>
<StackPanel Grid.Row="3" Orientation="Horizontal" HorizontalAlignment="Right"> <StackPanel Grid.Row="3" Orientation="Horizontal" HorizontalAlignment="Right">
<Button Width="75" Margin="10 10 0 0" Click="AddCommand" Content="Add"/> <Button Width="75" Margin="10 10 0 0" Click="AddCommand" Content="Add"/>
<Button Width="75" Margin="10 10 0 0" Click="EditCommand" Content="Edit" IsVisible="False"/> <Button Width="75" Margin="10 10 0 0" Click="EditCommand" Content="Edit"/>
<Button Width="75" Margin="10 10 0 0" Click="DeleteCommand" Content="Delete"/> <Button Width="75" Margin="10 10 0 0" Click="DeleteCommand" Content="Delete"/>
</StackPanel> </StackPanel>
</Grid> </Grid>

@ -4,15 +4,14 @@ using Avalonia.Markup.Xaml;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using hass_workstation_service.Communication.NamedPipe; using hass_workstation_service.Communication.NamedPipe;
using JKang.IpcServiceFramework.Client; using JKang.IpcServiceFramework.Client;
using System.Threading.Tasks;
using Avalonia.Interactivity; using Avalonia.Interactivity;
using System.Reactive.Linq; using System.Reactive.Linq;
using UserInterface.ViewModels; using UserInterface.ViewModels;
using System.Security;
using hass_workstation_service.Communication.InterProcesCommunication.Models; using hass_workstation_service.Communication.InterProcesCommunication.Models;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Controls.ApplicationLifetimes;
using System.Threading.Tasks;
namespace UserInterface.Views namespace UserInterface.Views
{ {
@ -20,11 +19,11 @@ namespace UserInterface.Views
{ {
private readonly IIpcClient<IServiceContractInterfaces> _client; private readonly IIpcClient<IServiceContractInterfaces> _client;
private readonly DataGrid _dataGrid; private readonly DataGrid _dataGrid;
private bool _sensorsNeedToRefresh; private bool _commandsNeedToRefresh;
public CommandSettings() public CommandSettings()
{ {
this.InitializeComponent(); InitializeComponent();
// register IPC clients // register IPC clients
ServiceProvider serviceProvider = new ServiceCollection() ServiceProvider serviceProvider = new ServiceCollection()
.AddNamedPipeIpcClient<IServiceContractInterfaces>("commands", pipeName: "pipeinternal") .AddNamedPipeIpcClient<IServiceContractInterfaces>("commands", pipeName: "pipeinternal")
@ -35,27 +34,36 @@ namespace UserInterface.Views
.GetRequiredService<IIpcClientFactory<IServiceContractInterfaces>>(); .GetRequiredService<IIpcClientFactory<IServiceContractInterfaces>>();
// create client // create client
this._client = clientFactory.CreateClient("commands"); _client = clientFactory.CreateClient("commands");
_dataGrid = this.FindControl<DataGrid>("Grid");
DataContext = new CommandSettingsViewModel(); DataContext = new CommandSettingsViewModel();
GetConfiguredCommands(); GetConfiguredCommands();
}
this._dataGrid = this.FindControl<DataGrid>("Grid"); private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
} }
public async void GetConfiguredCommands() public async void GetConfiguredCommands()
{ {
_sensorsNeedToRefresh = false; List<ConfiguredCommandModel> status = await _client.InvokeAsync(x => x.GetConfiguredCommands());
List<ConfiguredCommandModel> status = await this._client.InvokeAsync(x => x.GetConfiguredCommands());
((CommandSettingsViewModel)this.DataContext).ConfiguredCommands = status.Select(s => ((CommandSettingsViewModel)DataContext).ConfiguredCommands = status.Select(s =>
new CommandViewModel() new CommandViewModel()
{ {
Name = s.Name, Name = s.Name,
Type = s.Type, Type = s.Type,
Id = s.Id Id = s.Id
}).ToList(); }).ToList();
if (_commandsNeedToRefresh)
{
await Task.Delay(1000);
GetConfiguredCommands();
_commandsNeedToRefresh = false;
}
} }
public async void AddCommand(object sender, RoutedEventArgs args) public async void AddCommand(object sender, RoutedEventArgs args)
@ -64,14 +72,22 @@ namespace UserInterface.Views
if (Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) if (Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{ {
await dialog.ShowDialog(desktop.MainWindow); await dialog.ShowDialog(desktop.MainWindow);
_sensorsNeedToRefresh = true;
GetConfiguredCommands(); GetConfiguredCommands();
} }
} }
public void EditCommand(object sender, RoutedEventArgs args) public async void EditCommand(object sender, RoutedEventArgs args)
{ {
if (_dataGrid.SelectedItem is not CommandViewModel item)
return;
var dialog = new AddCommandDialog(item.Id);
if (Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
await dialog.ShowDialog(desktop.MainWindow);
_commandsNeedToRefresh = true;
GetConfiguredCommands();
}
} }
public void DeleteCommand(object sender, RoutedEventArgs args) public void DeleteCommand(object sender, RoutedEventArgs args)
@ -79,7 +95,7 @@ namespace UserInterface.Views
if (_dataGrid.SelectedItem is not CommandViewModel item) if (_dataGrid.SelectedItem is not CommandViewModel item)
return; return;
this._client.InvokeAsync(x => x.RemoveCommandById(item.Id)); _client.InvokeAsync(x => x.RemoveCommandById(item.Id));
if (DataContext is not CommandSettingsViewModel viewModel) if (DataContext is not CommandSettingsViewModel viewModel)
return; return;
@ -88,10 +104,5 @@ namespace UserInterface.Views
_dataGrid.SelectedIndex = -1; _dataGrid.SelectedIndex = -1;
viewModel.TriggerUpdate(); viewModel.TriggerUpdate();
} }
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
} }
} }

@ -28,7 +28,7 @@
<TextBlock Grid.Row="2" IsVisible="{Binding !ConfiguredSensors.Count}" Text="Add some sensors by clicking the 'Add' button."/> <TextBlock Grid.Row="2" IsVisible="{Binding !ConfiguredSensors.Count}" Text="Add some sensors by clicking the 'Add' button."/>
<StackPanel Grid.Row="3" Orientation="Horizontal" HorizontalAlignment="Right"> <StackPanel Grid.Row="3" Orientation="Horizontal" HorizontalAlignment="Right">
<Button Width="75" Margin="10 10 0 0" Click="AddSensor" Content="Add"/> <Button Width="75" Margin="10 10 0 0" Click="AddSensor" Content="Add"/>
<Button Width="75" Margin="10 10 0 0" Click="EditSensor" Content="Edit" IsVisible="False"/> <Button Width="75" Margin="10 10 0 0" Click="EditSensor" Content="Edit"/>
<Button Width="75" Margin="10 10 0 0" Click="DeleteSensor" Content="Delete"/> <Button Width="75" Margin="10 10 0 0" Click="DeleteSensor" Content="Delete"/>
</StackPanel> </StackPanel>
</Grid> </Grid>

@ -8,7 +8,6 @@ using System.Threading.Tasks;
using Avalonia.Interactivity; using Avalonia.Interactivity;
using System.Reactive.Linq; using System.Reactive.Linq;
using UserInterface.ViewModels; using UserInterface.ViewModels;
using System.Security;
using hass_workstation_service.Communication.InterProcesCommunication.Models; using hass_workstation_service.Communication.InterProcesCommunication.Models;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -24,7 +23,7 @@ namespace UserInterface.Views
public SensorSettings() public SensorSettings()
{ {
this.InitializeComponent(); InitializeComponent();
// register IPC clients // register IPC clients
ServiceProvider serviceProvider = new ServiceCollection() ServiceProvider serviceProvider = new ServiceCollection()
.AddNamedPipeIpcClient<IServiceContractInterfaces>("sensors", pipeName: "pipeinternal") .AddNamedPipeIpcClient<IServiceContractInterfaces>("sensors", pipeName: "pipeinternal")
@ -35,21 +34,24 @@ namespace UserInterface.Views
.GetRequiredService<IIpcClientFactory<IServiceContractInterfaces>>(); .GetRequiredService<IIpcClientFactory<IServiceContractInterfaces>>();
// create client // create client
this._client = clientFactory.CreateClient("sensors"); _client = clientFactory.CreateClient("sensors");
_dataGrid = this.FindControl<DataGrid>("Grid");
DataContext = new SensorSettingsViewModel(); DataContext = new SensorSettingsViewModel();
GetConfiguredSensors(); GetConfiguredSensors();
}
this._dataGrid = this.FindControl<DataGrid>("Grid"); private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
} }
public async void GetConfiguredSensors() public async void GetConfiguredSensors()
{ {
_sensorsNeedToRefresh = false; _sensorsNeedToRefresh = false;
List<ConfiguredSensorModel> status = await this._client.InvokeAsync(x => x.GetConfiguredSensors()); List<ConfiguredSensorModel> status = await _client.InvokeAsync(x => x.GetConfiguredSensors());
((SensorSettingsViewModel)this.DataContext).ConfiguredSensors = status.Select(s => ((SensorSettingsViewModel)DataContext).ConfiguredSensors = status.Select(s =>
new SensorViewModel() new SensorViewModel()
{ {
Name = s.Name, Name = s.Name,
@ -63,8 +65,8 @@ namespace UserInterface.Views
while (!_sensorsNeedToRefresh) while (!_sensorsNeedToRefresh)
{ {
await Task.Delay(1000); await Task.Delay(1000);
List<ConfiguredSensorModel> statusUpdated = await this._client.InvokeAsync(x => x.GetConfiguredSensors()); List<ConfiguredSensorModel> statusUpdated = await _client.InvokeAsync(x => x.GetConfiguredSensors());
var configuredSensors = ((SensorSettingsViewModel)this.DataContext).ConfiguredSensors; var configuredSensors = ((SensorSettingsViewModel)DataContext).ConfiguredSensors;
// this is a workaround for the list showing before it has been completely loaded in the service // this is a workaround for the list showing before it has been completely loaded in the service
if (statusUpdated.Count != configuredSensors.Count) if (statusUpdated.Count != configuredSensors.Count)
{ {
@ -95,9 +97,18 @@ namespace UserInterface.Views
} }
} }
public void EditSensor(object sender, RoutedEventArgs args) public async void EditSensor(object sender, RoutedEventArgs args)
{ {
if (_dataGrid.SelectedItem is not SensorViewModel item)
return;
var dialog = new AddSensorDialog(item.Id);
if (Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
await dialog.ShowDialog(desktop.MainWindow);
_sensorsNeedToRefresh = true;
GetConfiguredSensors();
}
} }
public void DeleteSensor(object sender, RoutedEventArgs args) public void DeleteSensor(object sender, RoutedEventArgs args)
@ -105,7 +116,7 @@ namespace UserInterface.Views
if (_dataGrid.SelectedItem is not SensorViewModel item) if (_dataGrid.SelectedItem is not SensorViewModel item)
return; return;
this._client.InvokeAsync(x => x.RemoveSensorById(item.Id)); _client.InvokeAsync(x => x.RemoveSensorById(item.Id));
if (DataContext is not SensorSettingsViewModel viewModel) if (DataContext is not SensorSettingsViewModel viewModel)
return; return;
@ -114,10 +125,5 @@ namespace UserInterface.Views
_dataGrid.SelectedIndex = -1; _dataGrid.SelectedIndex = -1;
viewModel.TriggerUpdate(); viewModel.TriggerUpdate();
} }
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
} }
} }
Loading…
Cancel
Save