using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Data; using Tango.BL; using Tango.BL.Builders; using Tango.BL.Entities; using Tango.Core.Commands; using Tango.MachineStudio.ColorLab.ViewModels; using Tango.MachineStudio.Common; using Tango.MachineStudio.Common.Notifications; using Tango.MachineStudio.RML.Contracts; using Tango.MachineStudio.RML.Views; namespace Tango.MachineStudio.RML.ViewModels { public class MainViewVM : StudioViewModel { private INotificationProvider _notification; private ObservablesContext _rmls_context; private ObservablesContext _active_context; private ObservableCollection _rmls; public ObservableCollection Rmls { get { return _rmls; } set { _rmls = value; RaisePropertyChangedAuto(); } } private ObservableCollection _materials; public ObservableCollection Materials { get { return _materials; } set { _materials = value; RaisePropertyChangedAuto(); } } private ObservableCollection _colors; public ObservableCollection Colors { get { return _colors; } set { _colors = value; RaisePropertyChangedAuto(); } } private ObservableCollection _purposes; public ObservableCollection Purposes { get { return _purposes; } set { _purposes = value; RaisePropertyChangedAuto(); } } private ObservableCollection _conditions; public ObservableCollection Conditions { get { return _conditions; } set { _conditions = value; RaisePropertyChangedAuto(); } } private ObservableCollection _linearMassDensityUnits; public ObservableCollection LinearMassDensityUnits { get { return _linearMassDensityUnits; } set { _linearMassDensityUnits = value; RaisePropertyChangedAuto(); } } private ObservableCollection _fiberShapes; public ObservableCollection FiberShapes { get { return _fiberShapes; } set { _fiberShapes = value; RaisePropertyChangedAuto(); } } private ObservableCollection _fiberSynths; public ObservableCollection FiberSynths { get { return _fiberSynths; } set { _fiberSynths = value; RaisePropertyChangedAuto(); } } private Rml _selectedRML; public Rml SelectedRML { get { return _selectedRML; } set { _selectedRML = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); } } private Rml _activeRML; public Rml ActiveRML { get { return _activeRML; } set { _activeRML = value; RaisePropertyChangedAuto(); } } private CalibrationDataViewVM _calibrationDataViewVM; public CalibrationDataViewVM CalibrationDataViewVM { get { return _calibrationDataViewVM; } set { _calibrationDataViewVM = value; RaisePropertyChangedAuto(); } } private ObservableCollection _liquidTypesRmls; public ObservableCollection LiquidTypesRmls { get { return _liquidTypesRmls; } set { _liquidTypesRmls = value; RaisePropertyChangedAuto(); } } private ProcessParametersTablesGroup _activeProcessParametersGroup; public ProcessParametersTablesGroup ActiveProcessParametersGroup { get { return _activeProcessParametersGroup; } set { _activeProcessParametersGroup = value; RaisePropertyChangedAuto(); } } private ICollectionView _activeProcessParametersTableView; public ICollectionView ActiveProcessParametersTableView { get { return _activeProcessParametersTableView; } set { _activeProcessParametersTableView = value; RaisePropertyChangedAuto(); } } /// /// Gets or sets the manage RML command. /// public RelayCommand ManageRmlCommand { get; set; } /// /// Gets or sets the add RML command. /// public RelayCommand AddRmlCommand { get; set; } /// /// Gets or sets the remove RML command. /// public RelayCommand RemoveRmlCommand { get; set; } public RelayCommand AddProcessParametersTableCommand { get; set; } public RelayCommand RemoveProcessParametersTableCommand { get; set; } public RelayCommand AddLiquidFactorCommand { get; set; } public RelayCommand RemoveLiquidFactorCommand { get; set; } public RelayCommand CreateCalibrationDataExcelTemplateCommand { get; set; } /// /// Gets or sets the back to RMLS command. /// public RelayCommand BackToRmlsCommand { get; set; } public MainViewVM(INotificationProvider notificationProvider) { _notification = notificationProvider; ManageRmlCommand = new RelayCommand(() => LoadActiveRML(SelectedRML.Guid), () => SelectedRML != null); RemoveRmlCommand = new RelayCommand(RemoveSelectedRml); AddRmlCommand = new RelayCommand(AddNewRml); BackToRmlsCommand = new RelayCommand(BackToRmls); AddProcessParametersTableCommand = new RelayCommand(AddProcessParametersTable); RemoveProcessParametersTableCommand = new RelayCommand(RemoveProcessParametersTable); AddLiquidFactorCommand = new RelayCommand(AddLiquidFactor); RemoveLiquidFactorCommand = new RelayCommand(RemoveLiquidFactor); CreateCalibrationDataExcelTemplateCommand = new RelayCommand(CreateCalibrationDataExcelTemplate); } public override void OnApplicationReady() { LoadRmls(); } private async void LoadRmls() { using (_rmls_context = ObservablesContext.CreateDefault()) { await Task.Factory.StartNew(() => { Rmls = _rmls_context.Rmls.ToList().ToObservableCollection(); }); } } private async void LoadActiveRML(String guid) { using (_notification.PushTaskItem("Loading RML...")) { IsFree = false; if (_active_context != null) { _active_context.Dispose(); } _active_context = ObservablesContext.CreateDefault(); LoadRmlProperties(); ActiveRML = await new RmlBuilder(_active_context) .Set(guid) .WithActiveParametersGroup() .WithLiquidFactors() .WithMediaProperties() .BuildAsync(); ActiveProcessParametersGroup = ActiveRML.ProcessParametersTablesGroups.ToList().FirstOrDefault(); ActiveProcessParametersTableView = CollectionViewSource.GetDefaultView(ActiveProcessParametersGroup.ProcessParametersTables); ActiveProcessParametersTableView.SortDescriptions.Add(new SortDescription(nameof(ProcessParametersTable.TableIndex), ListSortDirection.Ascending)); CalibrationDataViewVM = new CalibrationDataViewVM(); LiquidTypesRmls = ActiveRML.LiquidTypesRmls; foreach (var liquidTypeRml in LiquidTypesRmls) { CalibrationDataVM catVM = new CalibrationDataVM(); catVM.Name = liquidTypeRml.LiquidType.Name; catVM.Color = liquidTypeRml.LiquidType.Color; catVM.LiquidType = liquidTypeRml.LiquidType; if (liquidTypeRml.DefaultCatData != null) { catVM.CalibrationPoints = liquidTypeRml.GetCalibrationData().CalibrationPoints.Select(x => new CalibrationDataPointVM(x.X, x.Y)).ToObservableCollection(); } CalibrationDataViewVM.LiquidsCalibrationData.Add(catVM); } View.NavigateTo(RmlNavigationView.RmlView); IsFree = true; } } private void LoadRmlProperties() { Materials = _active_context.MediaMaterials.ToObservableCollection(); Colors = _active_context.MediaColors.ToObservableCollection(); Purposes = _active_context.MediaPurposes.ToObservableCollection(); Conditions = _active_context.MediaConditions.ToObservableCollection(); LinearMassDensityUnits = _active_context.LinearMassDensityUnits.ToObservableCollection(); FiberShapes = _active_context.FiberShapes.ToObservableCollection(); FiberSynths = _active_context.FiberSynths.ToObservableCollection(); } private async void AddNewRml() { var name = _notification.ShowTextInput("Please enter RML name", "Name"); if (!String.IsNullOrWhiteSpace(name)) { if (Rmls.ToList().Exists(x => x.Name == name)) { _notification.ShowError("The specified RML name already exists. Please select a different name."); return; } using (_notification.PushTaskItem("Creating new RML...")) { IsFree = false; if (_active_context != null) { _active_context.Dispose(); } LoadRmlProperties(); Rml rml = new Rml(); rml.Name = name; rml.Manufacturer = "Twine"; rml.Code = Rmls.Max(x => x.Code) + 1; rml.MediaMaterial = Materials.FirstOrDefault(); rml.MediaColor = Colors.FirstOrDefault(); rml.MediaPurpose = Purposes.FirstOrDefault(); rml.MediaCondition = Conditions.FirstOrDefault(); rml.LinearMassDensityUnit = LinearMassDensityUnits.FirstOrDefault(); rml.FiberShape = FiberShapes.FirstOrDefault(); rml.FiberSynth = FiberSynths.FirstOrDefault(); _active_context.Rmls.Add(rml); await _active_context.SaveChangesAsync(); LoadActiveRML(rml.Guid); IsFree = true; } } } private void RemoveSelectedRml() { } private void AddProcessParametersTable() { var name = _notification.ShowTextInput("Enter table name", "Name"); if (!String.IsNullOrWhiteSpace(name)) { _active_context.ProcessParametersTables.Add(new ProcessParametersTable() { ProcessParametersTablesGroup = ActiveProcessParametersGroup, Name = name, TableIndex = ActiveProcessParametersGroup.ProcessParametersTables.Max(x => x.TableIndex) + 1, }); } } public void OnProcessParametersTableDropped(ProcessParametersTable dragged, ProcessParametersTable dropped) { if (dragged.TableIndex > dropped.TableIndex) { dragged.TableIndex = dropped.TableIndex - 1; } else { dragged.TableIndex = dropped.TableIndex + 1; } int index = 0; foreach (var table in ActiveProcessParametersGroup.ProcessParametersTables.OrderBy(x => x.TableIndex)) { table.TableIndex = index++; } ActiveProcessParametersTableView.Refresh(); } private void RemoveLiquidFactor(LiquidTypesRml liquidFactor) { if (_notification.ShowQuestion("Removing this liquid factor will remove the liquid type association with the RML and will drop the calibration data. Are you sure?")) { var catVM = CalibrationDataViewVM.LiquidsCalibrationData.SingleOrDefault(x => x.LiquidType == liquidFactor.LiquidType); CalibrationDataViewVM.LiquidsCalibrationData.Remove(catVM); _active_context.LiquidTypesRmls.Remove(liquidFactor); } } private void AddLiquidFactor() { AddLiquidFactorViewVM vm = new AddLiquidFactorViewVM(_active_context); _notification.ShowModalDialog(vm, (_) => { if (LiquidTypesRmls.ToList().Exists(x => x.LiquidType == vm.SelectedLiquidType)) { _notification.ShowError("The selected liquid type is already associated with this RML."); return; } LiquidTypesRml liquidFactor = new LiquidTypesRml() { LiquidType = vm.SelectedLiquidType, Rml = ActiveRML, }; _active_context.LiquidTypesRmls.Add(liquidFactor); CalibrationDataVM catVM = new CalibrationDataVM(); catVM.Name = liquidFactor.LiquidType.Name; catVM.Color = liquidFactor.LiquidType.Color; CalibrationDataViewVM.LiquidsCalibrationData.Add(catVM); }, () => { }); } private void RemoveProcessParametersTable(ProcessParametersTable processParametersTable) { if (ActiveProcessParametersGroup.ProcessParametersTables.Count == 1) { _notification.ShowError("The process group must contain at least one table."); return; } if (_notification.ShowQuestion("Are you sure you want to remove this process parameters table?")) { _active_context.ProcessParametersTables.Remove(processParametersTable); } } private void CreateCalibrationDataExcelTemplate() { } private void BackToRmls() { View.NavigateTo(RmlNavigationView.RmlsView); LoadRmls(); } } }