diff options
Diffstat (limited to 'Software/Visual_Studio/PPC/Modules/Tango.PPC.Jobs/ViewModels/JobViewVM.cs')
| -rw-r--r-- | Software/Visual_Studio/PPC/Modules/Tango.PPC.Jobs/ViewModels/JobViewVM.cs | 343 |
1 files changed, 280 insertions, 63 deletions
diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Jobs/ViewModels/JobViewVM.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Jobs/ViewModels/JobViewVM.cs index f3e7711f9..023d91531 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Jobs/ViewModels/JobViewVM.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Jobs/ViewModels/JobViewVM.cs @@ -25,6 +25,8 @@ using Tango.SharedUI.Helpers; using Tango.PPC.Common.Navigation; using Tango.PPC.Jobs.NavigationObjects; using Tango.PPC.Jobs.ViewContracts; +using System.Collections.ObjectModel; +using Tango.PPC.Jobs.Models; namespace Tango.PPC.Jobs.ViewModels { @@ -39,19 +41,10 @@ namespace Tango.PPC.Jobs.ViewModels private Thread _check_gamut_thread; private Job _job_to_load; private JobNavigationIntent _job_to_load_intent; + private static Dictionary<String, List<FineTuneItem>> _jobs_fine_tune_items; #region Properties - private BL.Enumerations.JobStatuses _jobStatus; - /// <summary> - /// Gets or sets the temporary job status. - /// </summary> - public BL.Enumerations.JobStatuses JobStatus - { - get { return _jobStatus; } - set { _jobStatus = value; RaisePropertyChangedAuto(); } - } - private Job _job; /// <summary> /// Gets or sets the selected job. @@ -131,6 +124,46 @@ namespace Tango.PPC.Jobs.ViewModels /// </summary> public AutoCompleteProvider<Customer> CustomersAutoCompleteProvider { get; set; } + private ObservableCollection<FineTuneItem> _fineTuneItems; + /// <summary> + /// Gets or sets the fine tune items. + /// </summary> + public ObservableCollection<FineTuneItem> FineTuneItems + { + get { return _fineTuneItems; } + set { _fineTuneItems = value; RaisePropertyChangedAuto(); } + } + + private ObservableCollection<FineTuneItem> _approvalFineTuneItems; + /// <summary> + /// Gets or sets the fine tune items. + /// </summary> + public ObservableCollection<FineTuneItem> ApprovalFineTuneItems + { + get { return _approvalFineTuneItems; } + set { _approvalFineTuneItems = value; RaisePropertyChangedAuto(); } + } + + private bool _isFineTuneExpanded; + /// <summary> + /// Gets or sets a value indicating whether the fine tuning region is expanded. + /// </summary> + public bool IsFineTuneExpanded + { + get { return _isFineTuneExpanded; } + set + { + _isFineTuneExpanded = value; + RaisePropertyChangedAuto(); + + if (_isFineTuneExpanded) + { + SyncFineTuneItemsToBrushStops(); + } + } + } + + #endregion #region Commands @@ -214,17 +247,54 @@ namespace Tango.PPC.Jobs.ViewModels /// Gets or sets another sample command. /// </summary> public RelayCommand AnotherSampleCommand { get; set; } + + /// <summary> + /// Gets or sets the invoke fine tuning palette command. + /// </summary> + public RelayCommand<FineTuneItem> InvokeFineTuningPaletteCommand { get; set; } + + /// <summary> + /// Gets or sets the reset fine tuning command. + /// </summary> + public RelayCommand ResetFineTuningCommand { get; set; } + + /// <summary> + /// Gets or sets the start fine tuning command. + /// </summary> + public RelayCommand StartFineTuningCommand { get; set; } + + /// <summary> + /// Gets or sets the approve fine tuning command. + /// </summary> + public RelayCommand ApproveFineTuningCommand { get; set; } + + /// <summary> + /// Gets or sets the repeat fine tuning command. + /// </summary> + public RelayCommand RepeatFineTuningCommand { get; set; } + #endregion #region Constructors /// <summary> + /// Initializes the <see cref="JobViewVM"/> class. + /// </summary> + static JobViewVM() + { + _jobs_fine_tune_items = new Dictionary<string, List<FineTuneItem>>(); + } + + /// <summary> /// Initializes a new instance of the <see cref="JobViewVM"/> class. /// </summary> public JobViewVM() { RegisterForMessage<JobSelectedMessage>(HandleJobSelectedMessage); + FineTuneItems = new ObservableCollection<FineTuneItem>(); + ApprovalFineTuneItems = new ObservableCollection<FineTuneItem>(); + CustomersAutoCompleteProvider = new AutoCompleteProvider<Customer>((customer, filter) => { return customer.Name.ToLower().StartsWith(filter != null ? filter.ToLower() : String.Empty); @@ -268,6 +338,11 @@ namespace Tango.PPC.Jobs.ViewModels ApproveSampleCommand = new RelayCommand(ApproveSampleDye); RepeatSampleDyeCommand = new RelayCommand(RepeatSampleDye); AnotherSampleCommand = new RelayCommand(DyeAnotherSample); + InvokeFineTuningPaletteCommand = new RelayCommand<FineTuneItem>(InvokeFineTuningPalette); + ResetFineTuningCommand = new RelayCommand(ResetFineTuning); + StartFineTuningCommand = new RelayCommand(StartFineTuning, () => FineTuneItems.Any(x => x.IsSelected)); + RepeatFineTuningCommand = new RelayCommand(RepeatFineTuning); + ApproveFineTuningCommand = new RelayCommand(ApproveFineTuning); } #endregion @@ -275,15 +350,62 @@ namespace Tango.PPC.Jobs.ViewModels #region Job Management /// <summary> - /// Saves the job. + /// Loads the job. /// </summary> - private async void SaveJob(bool displayNotification = true) + private async void LoadJob() { - if (JobStatus != BL.Enumerations.JobStatuses.Draft) + if (!(_job_to_load == null || (_job_to_load != null && Job != null && _job_to_load.Guid == Job.Guid))) + { + NotificationProvider.SetGlobalBusyMessage("Loading job details..."); + + _can_navigate_back = false; + base.OnNavigatedTo(); + + _db = ObservablesContext.CreateDefault(); + var a = _db.Jobs.ToList(); + Job = await _db.Jobs.SingleOrDefaultAsync(x => x.Guid == _job_to_load.Guid); + Job.ValidateOnPropertyChanged = true; + Rmls = await _db.Rmls.ToListAsync(); + ColorSpaces = await _db.ColorSpaces.ToListAsync(); + SpoolTypes = await _db.SpoolTypes.ToListAsync(); + Customers = await _db.Customers.Where(x => x.OrganizationGuid == MachineProvider.Machine.OrganizationGuid).ToListAsync(); + + if (!_check_gamut_thread.IsAlive) + { + _check_gamut_thread.Start(); + } + + SegmentsCollectionView = CollectionViewSource.GetDefaultView(Job.Segments); + SegmentsCollectionView.SortDescriptions.Add(new SortDescription(nameof(Segment.SegmentIndex), ListSortDirection.Ascending)); + + InvokeUIOnIdle(() => + { + NotificationProvider.ReleaseGlobalBusyMessage(); + }); + + _job_to_load = null; + } + + if (!_jobs_fine_tune_items.ContainsKey(Job.Guid) && Job.JobFineTuningStatus == BL.Enumerations.FineTuningStatuses.PendingApproval) { - Job.JobStatus = JobStatus; + Job.JobFineTuningStatus = BL.Enumerations.FineTuningStatuses.Unspecified; } + if (Job.JobEditingState == BL.Enumerations.EditingStates.SampleDye && Job.JobSampleDyeStatus == BL.Enumerations.SampleDyeStatuses.PendingApproval) + { + View.DisplaySampleDye(); + } + else if (Job.JobEditingState == BL.Enumerations.EditingStates.FineTuning && Job.JobFineTuningStatus == BL.Enumerations.FineTuningStatuses.PendingApproval) + { + View.DisplayFineTuning(); + } + } + + /// <summary> + /// Saves the job. + /// </summary> + private async void SaveJob(bool displayNotification = true) + { if (Job.Validate(_db)) { await _db.SaveChangesAsync(); @@ -310,12 +432,18 @@ namespace Tango.PPC.Jobs.ViewModels } } + /// <summary> + /// Starts the job. + /// </summary> private void StartJob() { MachineProvider.MachineOperator.Print(Job); NavigationManager.NavigateTo<JobsModule>(nameof(JobProgressView)); } + /// <summary> + /// Determines whether this instance [can start job]. + /// </summary> private bool CanStartJob() { return @@ -488,7 +616,7 @@ namespace Tango.PPC.Jobs.ViewModels { Job sampleDyeJob = Job.Clone(); sampleDyeJob.Guid = Job.Guid; - sampleDyeJob.IsSample = true; + sampleDyeJob.Designation = BL.Enumerations.JobDesignations.SampleDye; sampleDyeJob.Name = Job.Name + " (sample)"; if (Job.JobType == BL.Enumerations.JobTypes.Embroidery) @@ -508,14 +636,17 @@ namespace Tango.PPC.Jobs.ViewModels SaveJob(false); var thisJob = Job; + var thisContext = _db; - MachineProvider.MachineOperator.Print(sampleDyeJob).Completed += (x, e) => + MachineProvider.MachineOperator.Print(sampleDyeJob).Completed += async (x, e) => { thisJob.JobStatus = BL.Enumerations.JobStatuses.PendingApproval; if (Job != null && Job.Guid == thisJob.Guid) { - JobStatus = BL.Enumerations.JobStatuses.PendingApproval; + thisJob.JobEditingState = BL.Enumerations.EditingStates.SampleDye; + thisJob.JobSampleDyeStatus = BL.Enumerations.SampleDyeStatuses.PendingApproval; + await thisContext.SaveChangesAsync(); } }; @@ -527,7 +658,8 @@ namespace Tango.PPC.Jobs.ViewModels /// </summary> private void RepeatSampleDye() { - JobStatus = BL.Enumerations.JobStatuses.Draft; + Job.JobEditingState = BL.Enumerations.EditingStates.Default; + Job.JobSampleDyeStatus = BL.Enumerations.SampleDyeStatuses.Unspecified; } /// <summary> @@ -535,7 +667,10 @@ namespace Tango.PPC.Jobs.ViewModels /// </summary> private void ApproveSampleDye() { - JobStatus = BL.Enumerations.JobStatuses.Approved; + Job.JobEditingState = BL.Enumerations.EditingStates.Default; + Job.JobSampleDyeStatus = BL.Enumerations.SampleDyeStatuses.Approved; + + Job.SampleDyeApproveDate = DateTime.UtcNow; SaveJob(false); } @@ -544,7 +679,130 @@ namespace Tango.PPC.Jobs.ViewModels /// </summary> private void DyeAnotherSample() { - JobStatus = BL.Enumerations.JobStatuses.Draft; + Job.JobEditingState = BL.Enumerations.EditingStates.Default; + Job.JobSampleDyeStatus = BL.Enumerations.SampleDyeStatuses.Unspecified; + } + + #endregion + + #region Fine Tuning + + /// <summary> + /// Synchronizes the fine tune items to brush stops. + /// </summary> + private void SyncFineTuneItemsToBrushStops() + { + if (Job != null) + { + if (_jobs_fine_tune_items.ContainsKey(Job.Guid)) + { + FineTuneItems = _jobs_fine_tune_items[Job.Guid].ToObservableCollection(); + } + else + { + FineTuneItems.Clear(); + + foreach (var stop in Job.Segments.SelectMany(x => x.BrushStops).DistinctBy(x => x.Color)) + { + FineTuneItem item = new FineTuneItem(TangoColorConverter.GetSuggestions(stop)); + item.BrushStops = Job.Segments.SelectMany(x => x.BrushStops).Where(x => x.Color == stop.Color).ToList(); + item.SelectedSuggestion = item.Suggestions[item.Suggestions.Count / 2]; + item.SelectedChanged += () => StartFineTuningCommand.RaiseCanExecuteChanged(); + FineTuneItems.Add(item); + } + + _jobs_fine_tune_items[Job.Guid] = FineTuneItems.ToList(); + } + + ApprovalFineTuneItems = FineTuneItems.Where(x => x.IsSelected).ToObservableCollection(); + + StartFineTuningCommand.RaiseCanExecuteChanged(); + } + } + + private async void InvokeFineTuningPalette(FineTuneItem fineTuneItem) + { + FineTuningPaletteViewVM vm = new FineTuningPaletteViewVM(fineTuneItem, Job); + await NotificationProvider.ShowDialog(vm); + + if (vm.DialogResult) + { + fineTuneItem.Suggestions = vm.Suggestions; + fineTuneItem.SelectedSuggestion = vm.SelectedSuggestion; + } + } + + private void ResetFineTuning() + { + SyncFineTuneItemsToBrushStops(); + } + + private void StartFineTuning() + { + try + { + Job fineTuneJob = Job.Clone(); + fineTuneJob.NumberOfUnits = 1; + fineTuneJob.Designation = BL.Enumerations.JobDesignations.FineTuning; + fineTuneJob.Guid = Job.Guid; + fineTuneJob.Name = Job.Name + " (fine tuning)"; + fineTuneJob.Segments.Clear(); + + foreach (var suggestion in FineTuneItems.Where(x => x.IsSelected).SelectMany(x => x.Suggestions)) + { + var segment = fineTuneJob.AddSolidSegment(suggestion.Color); + } + + _jobs_fine_tune_items[Job.Guid] = FineTuneItems.ToList(); + + var thisJob = Job; + var thisContext = _db; + + MachineProvider.MachineOperator.Print(fineTuneJob).Completed += async (x, e) => + { + thisJob.JobEditingState = BL.Enumerations.EditingStates.FineTuning; + thisJob.JobFineTuningStatus = BL.Enumerations.FineTuningStatuses.PendingApproval; + await thisContext.SaveChangesAsync(); + }; + + NavigationManager.NavigateTo<JobsModule>(nameof(JobProgressView)); + } + catch (Exception ex) + { + LogManager.Log(ex); + NotificationProvider.ShowError(ex.Message); + } + } + + private void ApproveFineTuning() + { + Job.JobEditingState = BL.Enumerations.EditingStates.Default; + Job.JobFineTuningStatus = BL.Enumerations.FineTuningStatuses.Approved; + + foreach (var item in ApprovalFineTuneItems) + { + foreach (var stop in item.BrushStops) + { + stop.Color = item.SelectedSuggestion.Color; + } + } + + + Job.FineTuningApproveDate = DateTime.UtcNow; + SaveJob(false); + + if (_jobs_fine_tune_items.ContainsKey(Job.Guid)) + { + _jobs_fine_tune_items.Remove(Job.Guid); + } + + SyncFineTuneItemsToBrushStops(); + } + + private void RepeatFineTuning() + { + Job.JobEditingState = BL.Enumerations.EditingStates.Default; + Job.JobFineTuningStatus = BL.Enumerations.FineTuningStatuses.Unspecified; } #endregion @@ -593,50 +851,9 @@ namespace Tango.PPC.Jobs.ViewModels /// <summary> /// Called when the navigation system has navigated to this VM view. /// </summary> - public async override void OnNavigatedTo() + public override void OnNavigatedTo() { - if (!(_job_to_load == null || (_job_to_load != null && Job != null && _job_to_load.Guid == Job.Guid))) - { - NotificationProvider.SetGlobalBusyMessage("Loading job details..."); - - _can_navigate_back = false; - base.OnNavigatedTo(); - - if (_db != null) - { - _db.Dispose(); - } - - _db = ObservablesContext.CreateDefault(); - var a = _db.Jobs.ToList(); - Job = await _db.Jobs.SingleOrDefaultAsync(x => x.Guid == _job_to_load.Guid); - Job.ValidateOnPropertyChanged = true; - Rmls = await _db.Rmls.ToListAsync(); - ColorSpaces = await _db.ColorSpaces.ToListAsync(); - SpoolTypes = await _db.SpoolTypes.ToListAsync(); - Customers = await _db.Customers.Where(x => x.OrganizationGuid == MachineProvider.Machine.OrganizationGuid).ToListAsync(); - - if (!_check_gamut_thread.IsAlive) - { - _check_gamut_thread.Start(); - } - - SegmentsCollectionView = CollectionViewSource.GetDefaultView(Job.Segments); - SegmentsCollectionView.SortDescriptions.Add(new SortDescription(nameof(Segment.SegmentIndex), ListSortDirection.Ascending)); - - InvokeUIOnIdle(() => - { - NotificationProvider.ReleaseGlobalBusyMessage(); - }); - - _job_to_load = null; - } - - if (_job_to_load_intent == JobNavigationIntent.SampleDye) - { - JobStatus = Job.JobStatus; - View.DisplaySampleDye(); - } + LoadJob(); } /// <summary> |
