aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner
diff options
context:
space:
mode:
authorRoy Ben Shabat <Roy.mail.net@gmail.com>2021-05-12 15:20:57 +0300
committerRoy Ben Shabat <Roy.mail.net@gmail.com>2021-05-12 15:20:57 +0300
commit5c1649221047dd4fe3d8de124f21a878a3e4b555 (patch)
treeb55bf8dd4d1a000162313224aa787ca253559bdd /Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner
parent896c8152facdee8e78f54d3dfdf324e7415173ba (diff)
downloadTango-5c1649221047dd4fe3d8de124f21a878a3e4b555.tar.gz
Tango-5c1649221047dd4fe3d8de124f21a878a3e4b555.zip
RML module and Machine designer lists performance improvements !
Diffstat (limited to 'Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner')
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Models/MachineModel.cs31
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Tango.MachineStudio.MachineDesigner.csproj3
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/ViewModels/MainViewVM.cs182
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MachinesView.xaml10
4 files changed, 159 insertions, 67 deletions
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Models/MachineModel.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Models/MachineModel.cs
new file mode 100644
index 000000000..8a2f5dd9f
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Models/MachineModel.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.BL.Entities;
+using Tango.Core;
+
+namespace Tango.MachineStudio.MachineDesigner.Models
+{
+ public class MachineModel : ExtendedObject
+ {
+ public String Guid { get; set; }
+
+ public String SerialNumber { get; set; }
+
+ public String Name { get; set; }
+
+ public String Organization { get; set; }
+
+ public String HardwareVersion { get; set; }
+
+ public String MachineVersion { get; set; }
+
+ public bool IsDemo { get; set; }
+
+ public bool IsDeviceRegistered { get; set; }
+
+ public DateTime LastUpdated { get; set; }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Tango.MachineStudio.MachineDesigner.csproj b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Tango.MachineStudio.MachineDesigner.csproj
index 69cc75461..07b3f360f 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Tango.MachineStudio.MachineDesigner.csproj
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Tango.MachineStudio.MachineDesigner.csproj
@@ -85,6 +85,7 @@
<Compile Include="Models\HardwareCollection.cs" />
<Compile Include="Models\HardwareComponent.cs" />
<Compile Include="Models\HardwareParameter.cs" />
+ <Compile Include="Models\MachineModel.cs" />
<Compile Include="ViewModelLocator.cs" />
<Compile Include="ViewModels\ColorCalibrationViewVM.cs" />
<Compile Include="ViewModels\HardwareConfigurationViewVM.cs" />
@@ -332,7 +333,7 @@
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<ProjectExtensions>
<VisualStudio>
- <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" />
+ <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" />
</VisualStudio>
</ProjectExtensions>
</Project> \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/ViewModels/MainViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/ViewModels/MainViewVM.cs
index 04e2b8826..4b5d0897d 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/ViewModels/MainViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/ViewModels/MainViewVM.cs
@@ -30,6 +30,7 @@ using Tango.MachineStudio.Common.Authentication;
using Tango.BL.DTO;
using Tango.Core.Cryptography;
using Tango.BL.Enumerations;
+using Tango.MachineStudio.MachineDesigner.Models;
namespace Tango.MachineStudio.MachineDesigner.ViewModels
{
@@ -52,13 +53,6 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
set { _isNewMachine = value; RaisePropertyChangedAuto(); }
}
- private ObservablesStaticCollections _machinesAdapter;
- public ObservablesStaticCollections MachinesAdapter
- {
- get { return _machinesAdapter; }
- set { _machinesAdapter = value; RaisePropertyChangedAuto(); }
- }
-
private ObservablesStaticCollections _activeMachineAdapter;
public ObservablesStaticCollections ActiveMachineAdapter
{
@@ -66,11 +60,21 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
set { _activeMachineAdapter = value; RaisePropertyChangedAuto(); }
}
- private Machine _selectedMachine;
+ private List<MachineModel> _machines;
+ /// <summary>
+ /// Gets or sets the available filtered machines.
+ /// </summary>
+ public List<MachineModel> Machines
+ {
+ get { return _machines; }
+ set { _machines = value; RaisePropertyChangedAuto(); }
+ }
+
+ private MachineModel _selectedMachine;
/// <summary>
/// Gets or sets the selected machine from the drop down.
/// </summary>
- public Machine SelectedMachine
+ public MachineModel SelectedMachine
{
get { return _selectedMachine; }
set
@@ -263,11 +267,12 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
/// </summary>
public MainViewVM(INotificationProvider notification, IAuthenticationProvider authentication, IActionLogManager actionLogManager)
{
- MachinesAdapter = new ObservablesStaticCollections(ObservablesContext.CreateDefault());
_notification = notification;
_authentication = authentication;
_actionLogManager = actionLogManager;
+ Machines = new List<MachineModel>();
+
_machines_action_timer = new ActionTimer(TimeSpan.FromMilliseconds(200));
_dispensers_action_timer = new ActionTimer(TimeSpan.FromMilliseconds(200));
@@ -292,17 +297,11 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
#endregion
- #region Application Ready
-
- public override async void OnApplicationReady()
+ public override void OnApplicationReady()
{
- MachinesAdapter.MachineVersions = (await MachinesAdapter.Context.MachineVersions.ToListAsync()).ToObservableCollection();
- MachinesAdapter.MachinePrototypes = (await MachinesAdapter.Context.MachinePrototypes.ToListAsync()).ToObservableCollection();
- MachinesAdapter.HardwareVersions = (await MachinesAdapter.Context.HardwareVersions.ToListAsync()).ToObservableCollection();
+
}
- #endregion
-
private void OnDispensersFilterChanged()
{
if (!String.IsNullOrWhiteSpace(DispensersFilter))
@@ -792,7 +791,7 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
if (SelectedMachine != null)
{
- await SelectedMachine.Reload(MachinesAdapter.Context);
+ await LoadMachines();
}
await ColorCalibrationViewVM.Invalidate();
@@ -810,19 +809,49 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
}
}
- private void AddNewMachine()
+ private async void AddNewMachine()
{
+ List<MachinePrototype> prototypes = new List<MachinePrototype>();
+ List<HardwareVersion> hardwareVersions = new List<HardwareVersion>();
+
+ try
+ {
+ IsFree = false;
+
+ using (_notification.PushTaskItem("Loading machine creation data..."))
+ {
+ using (ObservablesContext db = ObservablesContext.CreateDefault())
+ {
+ prototypes = await db.MachinePrototypes.ToListAsync();
+ hardwareVersions = await db.HardwareVersions.ToListAsync();
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, "Error loading machine creation data.");
+ _notification.ShowError($"Error loading machine creation data\n{ex.FlattenMessage()}");
+ return;
+ }
+ finally
+ {
+ IsFree = true;
+ }
+
MachineCreationDialogVM vm = new MachineCreationDialogVM();
vm.IsNewMachine = true;
- vm.Prototypes = MachinesAdapter.MachinePrototypes.ToList();
- vm.HardwareVersions = MachinesAdapter.HardwareVersions.OrderByDescending(x => x.Version).ToList();
+ vm.Prototypes = prototypes.ToList();
+ vm.HardwareVersions = hardwareVersions.OrderByDescending(x => x.Version).ToList();
vm.SelectedHardwareVersion = vm.HardwareVersions.FirstOrDefault();
_notification.ShowModalDialog<MachineCreationDialogVM, Views.MachineCreationDialog>(vm, (x) =>
{
- if (MachinesAdapter.Context.Machines.Any(y => y.SerialNumber == vm.SerialNumber || y.Name.ToLower() == vm.Name.ToLower()))
+ using (ObservablesContext db = ObservablesContext.CreateDefault())
{
- _notification.ShowError("Machine serial number or name already exists.");
- return;
+ if (db.Machines.Any(y => y.SerialNumber == vm.SerialNumber || y.Name.ToLower() == vm.Name.ToLower()))
+ {
+ _notification.ShowError("Machine serial number or name already exists.");
+ return;
+ }
}
LoadSelectedMachine(true, false, vm);
@@ -831,6 +860,8 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
private async void RemoveSelectedMachine()
{
+ if (SelectedMachine == null) return;
+
if (_notification.ShowQuestion("Are you sure you want to delete the selected machine?"))
{
using (_notification.PushTaskItem("Removing machine..."))
@@ -839,25 +870,28 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
{
IsFree = false;
- var machineToDelete = await new MachineBuilder(MachinesAdapter.Context).Set(SelectedMachine).WithConfiguration().BuildAsync();
-
- await machineToDelete.DeleteCascadeAsync(MachinesAdapter.Context);
- await machineToDelete.Configuration.DeleteCascadeAsync(MachinesAdapter.Context);
- foreach (var dispenser in machineToDelete.Configuration.NoneEmptyIdsPacks.Select(x => x.Dispenser))
+ using (ObservablesContext db = ObservablesContext.CreateDefault())
{
- if (dispenser != null)
+ var machineToDelete = await new MachineBuilder(db).Set(SelectedMachine.Guid).WithConfiguration().BuildAsync();
+
+ await machineToDelete.DeleteCascadeAsync(db);
+ await machineToDelete.Configuration.DeleteCascadeAsync(db);
+ foreach (var dispenser in machineToDelete.Configuration.NoneEmptyIdsPacks.Select(x => x.Dispenser))
{
- await dispenser.DeleteCascadeAsync(MachinesAdapter.Context);
+ if (dispenser != null)
+ {
+ await dispenser.DeleteCascadeAsync(db);
+ }
}
- }
- _actionLogManager.InsertLog(BL.Enumerations.ActionLogType.MachineDeleted, _authentication.CurrentUser, SelectedMachine.Name, SelectedMachine, "Machine deleted using Machine Studio.");
- MachinesAdapter.Context.Machines.Remove(SelectedMachine);
- MachinesAdapter.Machines.Remove(SelectedMachine);
+ await LoadMachines();
+
+ _actionLogManager.InsertLog(BL.Enumerations.ActionLogType.MachineDeleted, _authentication.CurrentUser, SelectedMachine.Name, machineToDelete, "Machine deleted using Machine Studio.");
+ }
}
catch (Exception ex)
{
- LogManager.Log(ex, $"Error removing machine {SelectedMachine.SerialNumber}.");
+ LogManager.Log(ex, $"Error removing machine selected machine.");
_notification.ShowError($"An error occurred while trying to delete the selected machine.\n{ex.Message}");
}
finally
@@ -895,7 +929,6 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
MachinePrototype prototype = MachinePrototype.CreateNew(ActiveMachine, protoName, protoName);
db.MachinePrototypes.Add(prototype);
await db.SaveChangesAsync();
- MachinesAdapter.MachinePrototypes = (await MachinesAdapter.Context.MachinePrototypes.ToListAsync()).ToObservableCollection();
}
}
catch (Exception ex)
@@ -915,13 +948,15 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
{
MachineCreationDialogVM vm = new MachineCreationDialogVM();
vm.IsNewMachine = false;
- vm.Prototypes = MachinesAdapter.MachinePrototypes.ToList();
_notification.ShowModalDialog<MachineCreationDialogVM, Views.MachineCreationDialog>(vm, (x) =>
{
- if (MachinesAdapter.Context.Machines.Any(y => y.SerialNumber == vm.SerialNumber || y.Name.ToLower() == vm.Name.ToLower()))
+ using (ObservablesContext db = ObservablesContext.CreateDefault())
{
- _notification.ShowError("Machine serial number or name already exists.");
- return;
+ if (db.Machines.Any(y => y.SerialNumber == vm.SerialNumber || y.Name.ToLower() == vm.Name.ToLower()))
+ {
+ _notification.ShowError("Machine serial number or name already exists.");
+ return;
+ }
}
LoadSelectedMachine(false, true, vm);
@@ -945,29 +980,54 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
}
}
- private void OnFilterChanged()
+ private async void OnFilterChanged()
+ {
+ await LoadMachines();
+ }
+
+ private async Task LoadMachines()
{
- if (Filter != null)
+ String filter = Filter.ToStringOrEmpty();
+
+ using (ObservablesContext db = ObservablesContext.CreateDefault())
{
- _machines_action_timer.ResetReplace(() =>
- {
- Task.Factory.StartNew(() =>
+ var machines = await db.Machines.Where(x => filter == String.Empty || x.SerialNumber.ToLower().StartsWith(filter.ToLower()) || x.Name.ToLower().Contains(filter.ToLower()))
+ .Include(x => x.Configuration)
+ .Include(x => x.MachineVersion.Name)
+ .Include(x => x.Organization.Name)
+ .Include(x => x.Configuration.HardwareVersion.Name)
+ .Include(x => x.Configuration.HardwareVersion.Version).Select(x => new
{
- try
- {
- IsFree = false;
- MachinesAdapter.Machines = MachinesAdapter.Context.Machines.Where(x => x.SerialNumber.StartsWith(Filter)).Include(x => x.Organization).Include(x => x.MachineVersion).Include(x => x.Configuration).Include(x => x.Configuration.HardwareVersion).OrderBy(x => x.SerialNumber).ToSynchronizedObservableCollection();
- }
- catch
- {
+ x.Guid,
+ x.SerialNumber,
+ x.Name,
+ Organization = x.Organization.Name,
+ MachineVersion = x.MachineVersion.Name,
+ HardwareVersionName = x.Configuration.HardwareVersion.Name,
+ HardwareVersionVersion = x.Configuration.HardwareVersion.Version,
+ x.IsDeviceRegistered,
+ x.IsDemo,
+ x.LastUpdated
+ }).OrderBy(x => x.SerialNumber).ToListAsync();
- }
- finally
- {
- IsFree = true;
- }
- });
- });
+ List<MachineModel> models = new List<MachineModel>();
+
+ foreach (var machine in machines)
+ {
+ MachineModel model = new MachineModel();
+ model.Guid = machine.Guid;
+ model.SerialNumber = machine.SerialNumber;
+ model.Name = machine.Name;
+ model.Organization = machine.Organization;
+ model.HardwareVersion = machine.HardwareVersionName + " v" + machine.HardwareVersionVersion;
+ model.MachineVersion = machine.MachineVersion;
+ model.IsDeviceRegistered = machine.IsDeviceRegistered;
+ model.IsDemo = machine.IsDemo;
+ model.LastUpdated = machine.LastUpdated;
+ models.Add(model);
+ }
+
+ Machines = models;
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MachinesView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MachinesView.xaml
index 1a271ead8..5fda6dbfa 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MachinesView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MachinesView.xaml
@@ -26,7 +26,7 @@
<StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" Margin="0 0 0 10">
<materialDesign:PackIcon VerticalAlignment="Center" Kind="BarcodeScan" Width="32" Height="32" />
- <TextBox Width="400" FontSize="20" Margin="10 0 0 0" materialDesign:HintAssist.Hint="Serial Number" Text="{Binding Filter,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,Delay=500}"></TextBox>
+ <TextBox Width="400" FontSize="20" Margin="10 0 0 0" materialDesign:HintAssist.Hint="Serial Number / Name" Text="{Binding Filter,UpdateSourceTrigger=PropertyChanged,Delay=500}"></TextBox>
</StackPanel>
</StackPanel>
</Grid>
@@ -61,7 +61,7 @@
</StackPanel>
</Grid>
<Grid IsEnabled="{Binding IsFree}">
- <controls:DoubleClickDataGrid Style="{StaticResource {x:Type DataGrid}}" DoubleClickCommand="{Binding EditMachineCommand}" Margin="0 0 0 10" SelectionMode="Single" SelectionUnit="FullRow" BorderBrush="{StaticResource borderBrush}" IsReadOnly="True" BorderThickness="1" Background="{StaticResource TransparentBackgroundBrush}" AlternatingRowBackground="{StaticResource Transparent200}" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" ItemsSource="{Binding MachinesAdapter.Machines}" SelectedItem="{Binding SelectedMachine}">
+ <controls:DoubleClickDataGrid Style="{StaticResource {x:Type DataGrid}}" DoubleClickCommand="{Binding EditMachineCommand}" Margin="0 0 0 10" SelectionMode="Single" SelectionUnit="FullRow" BorderBrush="{StaticResource borderBrush}" IsReadOnly="True" BorderThickness="1" Background="{StaticResource TransparentBackgroundBrush}" AlternatingRowBackground="{StaticResource Transparent200}" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" ItemsSource="{Binding Machines}" SelectedItem="{Binding SelectedMachine}">
<DataGrid.CellStyle>
<Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}">
<Setter Property="BorderThickness" Value="0"/>
@@ -72,9 +72,9 @@
<DataGrid.Columns>
<DataGridTextColumn Header="SERIAL NUMBER" Binding="{Binding SerialNumber}" Width="Auto" />
<DataGridTextColumn Header="NAME" Binding="{Binding Name}" Width="Auto" />
- <DataGridTextColumn Header="ORGANIZATION" Binding="{Binding Organization.Name}" Width="Auto" />
- <DataGridTextColumn Header="VERSION" Binding="{Binding MachineVersion.Name}" Width="Auto" />
- <DataGridTextColumn Header="HW" Binding="{Binding Configuration.HardwareVersion.FullName}" Width="Auto" />
+ <DataGridTextColumn Header="ORGANIZATION" Binding="{Binding Organization}" Width="Auto" />
+ <DataGridTextColumn Header="VERSION" Binding="{Binding MachineVersion}" Width="Auto" />
+ <DataGridTextColumn Header="HW" Binding="{Binding HardwareVersion}" Width="Auto" />
<DataGridTextColumn Header="REGISTERED" Binding="{Binding IsDeviceRegistered,Converter={StaticResource BooleanToYesNoConverter}}" Width="Auto" />
<DataGridTextColumn Header="DEMO MACHINE" Binding="{Binding IsDemo,Converter={StaticResource BooleanToYesNoConverter}}" Width="Auto" />
<DataGridTextColumn Header="LAST UPDATED" Binding="{Binding LastUpdated,Converter={StaticResource DateTimeUTCToShortDateTimeConverter}}" Width="1*" />