using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.Core.Commands; using Tango.BL.Entities; using Tango.MachineStudio.Common.Notifications; using Tango.SharedUI; using Tango.BL; using Tango.SharedUI.Components; using System.Runtime.CompilerServices; namespace Tango.MachineStudio.HardwareDesigner.ViewModels { public class MainViewVM : ViewModel { private INotificationProvider _notification; private bool _isNew; private ObservablesEntitiesAdapter _adapter; public ObservablesEntitiesAdapter Adapter { get { return _adapter; } set { _adapter = value; RaisePropertyChangedAuto(); } } private SelectedObjectCollection _motorTypes; public SelectedObjectCollection MotorTypes { get { return _motorTypes; } set { _motorTypes = value; RaisePropertyChangedAuto(); } } private ObservableCollection _selectedMotorTypes; public ObservableCollection SelectedMotorTypes { get { return _selectedMotorTypes; } set { _selectedMotorTypes = value; RaisePropertyChangedAuto(); } } private SelectedObjectCollection _dancerTypes; public SelectedObjectCollection DancerTypes { get { return _dancerTypes; } set { _dancerTypes = value; RaisePropertyChangedAuto(); } } private ObservableCollection _selectedDancerTypes; public ObservableCollection SelectedDancerTypes { get { return _selectedDancerTypes; } set { _selectedDancerTypes = value; RaisePropertyChangedAuto(); } } private SelectedObjectCollection _pidControlTypes; public SelectedObjectCollection PidControlTypes { get { return _pidControlTypes; } set { _pidControlTypes = value; RaisePropertyChangedAuto(); } } private ObservableCollection _selectedPidControlTypes; public ObservableCollection SelectedPidControlTypes { get { return _selectedPidControlTypes; } set { _selectedPidControlTypes = value; RaisePropertyChangedAuto(); } } private SelectedObjectCollection _winderTypes; public SelectedObjectCollection WinderTypes { get { return _winderTypes; } set { _winderTypes = value; RaisePropertyChangedAuto(); } } private ObservableCollection _selectedWinderTypes; public ObservableCollection SelectedWinderTypes { get { return _selectedWinderTypes; } set { _selectedWinderTypes = value; RaisePropertyChangedAuto(); } } private SelectedObjectCollection _speedSensorTypes; public SelectedObjectCollection SpeedSensorTypes { get { return _speedSensorTypes; } set { _speedSensorTypes = value; RaisePropertyChangedAuto(); } } private ObservableCollection _selectedSpeedSensorTypes; public ObservableCollection SelectedSpeedSensorTypes { get { return _selectedSpeedSensorTypes; } set { _selectedSpeedSensorTypes = value; RaisePropertyChangedAuto(); } } private HardwareVersion _selectedVersion; public HardwareVersion SelectedVersion { get { return _selectedVersion; } set { _selectedVersion = value; RaisePropertyChangedAuto(); OnSelectedVersionChanged(); } } private HardwareVersion _currentVersion; public HardwareVersion CurrentVersion { get { return _currentVersion; } set { _currentVersion = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); } } private IObservableEntity _selectedHardwareObject; public IObservableEntity SelectedHardwareObject { get { return _selectedHardwareObject; } set { _selectedHardwareObject = null; RaisePropertyChangedAuto(); _selectedHardwareObject = value; RaisePropertyChangedAuto(); } } private Object _selectedHardwareObjectType; public Object SelectedHardwareObjectType { get { return _selectedHardwareObjectType; } set { _selectedHardwareObjectType = null; RaisePropertyChangedAuto(); _selectedHardwareObjectType = value; RaisePropertyChangedAuto(); OnSelectedHardwareObjectTypeChanged(); } } public RelayCommand SaveCommand { get; set; } public RelayCommand DeleteCommand { get; set; } public RelayCommand NewCommand { get; set; } public RelayCommand CloneCommand { get; set; } public RelayCommand CopyParametersCommand { get; set; } public MainViewVM(INotificationProvider notification) { _notification = notification; Adapter = ObservablesEntitiesAdapter.Instance; SaveCommand = new RelayCommand(Save, () => SelectedVersion != null); NewCommand = new RelayCommand(New); DeleteCommand = new RelayCommand(Delete, () => !_isNew && SelectedVersion != null); CurrentVersion = new HardwareVersion(); CreateTemplate(CurrentVersion); CopyParametersCommand = new RelayCommand(CopyParameters,(x) => SelectedVersion != null && SelectedHardwareObjectType != null); CloneCommand = new RelayCommand(CloneCurrentVersion, () => SelectedVersion != null); } private void CopyParameters(object obj) { IObservableEntity source = obj.GetType().GetProperty("Data").GetValue(obj) as IObservableEntity; IObservableEntity target = null; if (source is HardwareMotorType) { target = CurrentVersion.HardwareMotors.SingleOrDefault(x => x.HardwareMotorType == source); } else if (source is HardwareDancerType) { target = CurrentVersion.HardwareDancers.SingleOrDefault(x => x.HardwareDancerType == source); } else if (source is HardwarePidControlType) { target = CurrentVersion.HardwarePidControls.SingleOrDefault(x => x.HardwarePidControlType == source); } else if (source is HardwareWinderType) { target = CurrentVersion.HardwareWinders.SingleOrDefault(x => x.HardwareWinderType == source); } else if (source is HardwareSpeedSensorType) { target = CurrentVersion.HardwareSpeedSensors.SingleOrDefault(x => x.HardwareSpeedSensorType == source); } target.MapPrimitivesTo(SelectedHardwareObject); } private void OnSelectedHardwareObjectTypeChanged() { if (SelectedHardwareObjectType != null) { if (SelectedHardwareObjectType is SelectedObject) { var type = (SelectedHardwareObjectType as SelectedObject).Data; var hardwareObj = CurrentVersion.HardwareMotors.SingleOrDefault(x => x.HardwareMotorType == type); if (hardwareObj != null) { SelectedHardwareObject = hardwareObj; } else { hardwareObj = new HardwareMotor() { HardwareMotorType = type }; CurrentVersion.HardwareMotors.Add(hardwareObj); SelectedHardwareObject = hardwareObj; } } else if (SelectedHardwareObjectType is SelectedObject) { var type = (SelectedHardwareObjectType as SelectedObject).Data; var hardwareObj = CurrentVersion.HardwareDancers.SingleOrDefault(x => x.HardwareDancerType == type); if (hardwareObj != null) { SelectedHardwareObject = hardwareObj; } else { hardwareObj = new HardwareDancer() { HardwareDancerType = type }; CurrentVersion.HardwareDancers.Add(hardwareObj); SelectedHardwareObject = hardwareObj; } } else if (SelectedHardwareObjectType is SelectedObject) { var type = (SelectedHardwareObjectType as SelectedObject).Data; var hardwareObj = CurrentVersion.HardwarePidControls.SingleOrDefault(x => x.HardwarePidControlType == type); if (hardwareObj != null) { SelectedHardwareObject = hardwareObj; } else { hardwareObj = new HardwarePidControl() { HardwarePidControlType = type }; CurrentVersion.HardwarePidControls.Add(hardwareObj); SelectedHardwareObject = hardwareObj; } } else if (SelectedHardwareObjectType is SelectedObject) { var type = (SelectedHardwareObjectType as SelectedObject).Data; var hardwareObj = CurrentVersion.HardwareWinders.SingleOrDefault(x => x.HardwareWinderType == type); if (hardwareObj != null) { SelectedHardwareObject = hardwareObj; } else { hardwareObj = new HardwareWinder() { HardwareWinderType = type }; CurrentVersion.HardwareWinders.Add(hardwareObj); SelectedHardwareObject = hardwareObj; } } else if (SelectedHardwareObjectType is SelectedObject) { var type = (SelectedHardwareObjectType as SelectedObject).Data; var hardwareObj = CurrentVersion.HardwareSpeedSensors.SingleOrDefault(x => x.HardwareSpeedSensorType == type); if (hardwareObj != null) { SelectedHardwareObject = hardwareObj; } else { hardwareObj = new HardwareSpeedSensor() { HardwareSpeedSensorType = type }; CurrentVersion.HardwareSpeedSensors.Add(hardwareObj); SelectedHardwareObject = hardwareObj; } } } } private void CreateTemplate(HardwareVersion version) { if (version == null) { SelectedMotorTypes = new ObservableCollection(); SelectedDancerTypes = new ObservableCollection(); SelectedPidControlTypes = new ObservableCollection(); SelectedWinderTypes = new ObservableCollection(); SelectedSpeedSensorTypes = new ObservableCollection(); } else { SelectedMotorTypes = version.HardwareMotors.Select(x => x.HardwareMotorType).ToObservableCollection(); SelectedDancerTypes = version.HardwareDancers.Select(x => x.HardwareDancerType).ToObservableCollection(); SelectedPidControlTypes = version.HardwarePidControls.Select(x => x.HardwarePidControlType).ToObservableCollection(); SelectedWinderTypes = version.HardwareWinders.Select(x => x.HardwareWinderType).ToObservableCollection(); SelectedSpeedSensorTypes = version.HardwareSpeedSensors.Select(x => x.HardwareSpeedSensorType).ToObservableCollection(); } MotorTypes = new SelectedObjectCollection(Adapter.HardwareMotorTypes, SelectedMotorTypes); DancerTypes = new SelectedObjectCollection(Adapter.HardwareDancerTypes, SelectedDancerTypes); PidControlTypes = new SelectedObjectCollection(Adapter.HardwarePidControlTypes, SelectedPidControlTypes); WinderTypes = new SelectedObjectCollection(Adapter.HardwareWinderTypes, SelectedWinderTypes); SpeedSensorTypes = new SelectedObjectCollection(Adapter.HardwareSpeedSensorTypes, SelectedSpeedSensorTypes); } private void OnSelectedVersionChanged() { if (SelectedVersion != null) { _isNew = false; CurrentVersion = SelectedVersion.Clone(); CreateTemplate(CurrentVersion); } InvalidateRelayCommands(); } private bool CheckCurrentVersionNull() { if (CurrentVersion == null) { _notification.ShowInfo("Please select a hardware version before attempting to insert any components."); return true; } return false; } private void New() { String name = _notification.ShowTextInput("Enter hardware version name", "Name"); if (!String.IsNullOrWhiteSpace(name)) { SelectedVersion = null; CurrentVersion = new HardwareVersion(); CurrentVersion.Version = Adapter.HardwareVersions.Max(x => x.Version) + 1; CurrentVersion.Name = name; CreateTemplate(CurrentVersion); _isNew = true; InvalidateRelayCommands(); } } private async void Save() { if (CurrentVersion != null) { using (_notification.PushTaskItem("Saving hardware version...")) { await Task.Factory.StartNew(() => { HardwareVersion realVersion = null; if (_isNew) { realVersion = CurrentVersion.Clone(); realVersion.HardwareMotors.ToList().Where(x => !SelectedMotorTypes.Contains(x.HardwareMotorType)).ToList().ForEach(x => realVersion.HardwareMotors.Remove(x)); realVersion.HardwareDancers.ToList().Where(x => !SelectedDancerTypes.Contains(x.HardwareDancerType)).ToList().ForEach(x => realVersion.HardwareDancers.Remove(x)); realVersion.HardwarePidControls.ToList().Where(x => !SelectedPidControlTypes.Contains(x.HardwarePidControlType)).ToList().ForEach(x => realVersion.HardwarePidControls.Remove(x)); realVersion.HardwareWinders.ToList().Where(x => !SelectedWinderTypes.Contains(x.HardwareWinderType)).ToList().ForEach(x => realVersion.HardwareWinders.Remove(x)); realVersion.HardwareSpeedSensors.ToList().Where(x => !SelectedSpeedSensorTypes.Contains(x.HardwareSpeedSensorType)).ToList().ForEach(x => realVersion.HardwareSpeedSensors.Remove(x)); } else { realVersion = Adapter.HardwareVersions.SingleOrDefault(x => x.Guid == SelectedVersion.Guid); realVersion.Version = CurrentVersion.Version; realVersion.Name = CurrentVersion.Name; realVersion.HardwareDancers.ToList().ForEach(x => x.DefferedDelete(Adapter.Context)); realVersion.HardwareMotors.ToList().ForEach(x => x.DefferedDelete(Adapter.Context)); realVersion.HardwarePidControls.ToList().ForEach(x => x.DefferedDelete(Adapter.Context)); realVersion.HardwareWinders.ToList().ForEach(x => x.DefferedDelete(Adapter.Context)); realVersion.HardwareSpeedSensors.ToList().ForEach(x => x.DefferedDelete(Adapter.Context)); realVersion.HardwareDancers.Clear(); realVersion.HardwareMotors.Clear(); realVersion.HardwarePidControls.Clear(); realVersion.HardwareWinders.Clear(); realVersion.HardwareSpeedSensors.Clear(); foreach (var type in SelectedDancerTypes) { var item = CurrentVersion.HardwareDancers.SingleOrDefault(x => x.HardwareDancerType == type); if (item != null) { item.HardwareVersionGuid = realVersion.Guid; realVersion.HardwareDancers.Add(item); } else { realVersion.HardwareDancers.Add(new HardwareDancer() { HardwareVersionGuid = realVersion.Guid, HardwareDancerType = type }); } } foreach (var type in SelectedMotorTypes) { var item = CurrentVersion.HardwareMotors.SingleOrDefault(x => x.HardwareMotorType == type); if (item != null) { item.HardwareVersionGuid = realVersion.Guid; realVersion.HardwareMotors.Add(item); } else { realVersion.HardwareMotors.Add(new HardwareMotor() { HardwareVersionGuid = realVersion.Guid, HardwareMotorType = type }); } } foreach (var type in SelectedPidControlTypes) { var item = CurrentVersion.HardwarePidControls.SingleOrDefault(x => x.HardwarePidControlType == type); if (item != null) { item.HardwareVersionGuid = realVersion.Guid; realVersion.HardwarePidControls.Add(item); } else { realVersion.HardwarePidControls.Add(new HardwarePidControl() { HardwareVersionGuid = realVersion.Guid, HardwarePidControlType = type }); } } foreach (var type in SelectedWinderTypes) { var item = CurrentVersion.HardwareWinders.SingleOrDefault(x => x.HardwareWinderType == type); if (item != null) { item.HardwareVersionGuid = realVersion.Guid; realVersion.HardwareWinders.Add(item); } else { realVersion.HardwareWinders.Add(new HardwareWinder() { HardwareVersionGuid = realVersion.Guid, HardwareWinderType = type }); } } foreach (var type in SelectedSpeedSensorTypes) { var item = CurrentVersion.HardwareSpeedSensors.SingleOrDefault(x => x.HardwareSpeedSensorType == type); if (item != null) { item.HardwareVersionGuid = realVersion.Guid; realVersion.HardwareSpeedSensors.Add(item); } else { realVersion.HardwareSpeedSensors.Add(new HardwareSpeedSensor() { HardwareVersionGuid = realVersion.Guid, HardwareSpeedSensorType = type }); } } } if (_isNew) { Adapter.Context.HardwareVersions.Add(realVersion); } realVersion.Save(Adapter.Context); SelectedVersion = Adapter.HardwareVersions.SingleOrDefault(x => x.Guid == realVersion.Guid); }); } } } private async void CloneCurrentVersion() { if (CurrentVersion != null) { String name = _notification.ShowTextInput("Enter new hardware configuration name", "Name", CurrentVersion.Name + " - Copy"); if (!String.IsNullOrWhiteSpace(name)) { using (_notification.PushTaskItem("Cloning hardware configuration...")) { await Task.Factory.StartNew(() => { var realVersion = CurrentVersion.Clone(); realVersion.Name = name; realVersion.Version = 1; realVersion.HardwareMotors.ToList().Where(x => !SelectedMotorTypes.Contains(x.HardwareMotorType)).ToList().ForEach(x => realVersion.HardwareMotors.Remove(x)); realVersion.HardwareDancers.ToList().Where(x => !SelectedDancerTypes.Contains(x.HardwareDancerType)).ToList().ForEach(x => realVersion.HardwareDancers.Remove(x)); realVersion.HardwarePidControls.ToList().Where(x => !SelectedPidControlTypes.Contains(x.HardwarePidControlType)).ToList().ForEach(x => realVersion.HardwarePidControls.Remove(x)); realVersion.HardwareWinders.ToList().Where(x => !SelectedWinderTypes.Contains(x.HardwareWinderType)).ToList().ForEach(x => realVersion.HardwareWinders.Remove(x)); realVersion.HardwareSpeedSensors.ToList().Where(x => !SelectedSpeedSensorTypes.Contains(x.HardwareSpeedSensorType)).ToList().ForEach(x => realVersion.HardwareSpeedSensors.Remove(x)); realVersion.HardwareMotors.ToList().ForEach(x => x.HardwareVersionGuid = realVersion.Guid); realVersion.HardwareDancers.ToList().ForEach(x => x.HardwareVersionGuid = realVersion.Guid); realVersion.HardwarePidControls.ToList().ForEach(x => x.HardwareVersionGuid = realVersion.Guid); realVersion.HardwareWinders.ToList().ForEach(x => x.HardwareVersionGuid = realVersion.Guid); realVersion.HardwareSpeedSensors.ToList().ForEach(x => x.HardwareVersionGuid = realVersion.Guid); realVersion.HardwareMotors.ToList().ForEach(x => x.HardwareVersion = realVersion); realVersion.HardwareDancers.ToList().ForEach(x => x.HardwareVersion = realVersion); realVersion.HardwarePidControls.ToList().ForEach(x => x.HardwareVersion = realVersion); realVersion.HardwareWinders.ToList().ForEach(x => x.HardwareVersion = realVersion); realVersion.HardwareSpeedSensors.ToList().ForEach(x => x.HardwareVersion = realVersion); Adapter.Context.HardwareVersions.Add(realVersion); realVersion.Save(Adapter.Context); SelectedVersion = Adapter.HardwareVersions.SingleOrDefault(x => x.Guid == realVersion.Guid); }); } } } } private void Delete() { if (_notification.ShowQuestion("Are you sure you want to delete this hardware version?")) { using (_notification.PushTaskItem("Deleting hardware version...")) { SelectedVersion.DeleteAsync(Adapter.Context); SelectedVersion = null; CurrentVersion = null; } } } protected override void RaisePropertyChangedAuto([CallerMemberName] string caller = null) { base.RaisePropertyChangedAuto(caller); InvalidateRelayCommands(); } } }