using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.BL; using Tango.BL.Builders; using Tango.BL.Entities; using Tango.BL.Enumerations; using Tango.Integration.Operation; using Tango.PPC.Common; using Tango.PPC.Common.Notifications; using Tango.PPC.Common.Notifications.NotificationItems; using Tango.PPC.Jobs.AppBarItems; using Tango.PPC.Jobs.Messages; using Tango.PPC.Jobs.NavigationObjects; using Tango.PPC.Jobs.Views; namespace Tango.PPC.Jobs.ViewModels { /// /// Represents the main view ViewModel. /// /// public class MainViewVM : PPCViewModel { private NotificationItem _last_failed_job_notification; private JobHandler _handler; private bool resuming; private JobProgressAppBarItem _appBarItem; /// /// Called when the application has been started. /// public override void OnApplicationStarted() { MachineProvider.MachineOperator.PrintingCompleted += MachineOperator_PrintingCompleted; MachineProvider.MachineOperator.PrintingFailed += MachineOperator_PrintingFailed; MachineProvider.MachineOperator.ResumingJob += MachineOperator_ResumingJob; MachineProvider.MachineOperator.PrintingStarted += MachineOperator_PrintingStarted; MachineProvider.MachineOperator.PrintingEnded += MachineOperator_PrintingEnded; NavigationManager.CurrentVMChanged += NavigationManager_CurrentVMChanged; } private void MachineOperator_PrintingEnded(object sender, PrintingEventArgs e) { _appBarItem?.Close(); _appBarItem = null; } private void NavigationManager_CurrentVMChanged(object sender, PPCViewModel vm) { if (vm.GetType() == typeof(JobProgressViewVM)) { _appBarItem?.Close(); _appBarItem = null; } else if (vm.GetType() != typeof(JobSummeryViewVM) && _appBarItem == null && MachineProvider.MachineOperator.IsPrinting && _handler != null && !_handler.IsCanceled) { _appBarItem = NotificationProvider.PushAppBarItem(); _appBarItem.Pressed += (_, __) => { _appBarItem?.Close(); NavigationManager.NavigateTo(nameof(JobProgressView)); }; } } private void MachineOperator_PrintingStarted(object sender, PrintingEventArgs e) { _handler = e.JobHandler; if (!BuildProvider.MachineType.IsXMachine()) { if (resuming) { resuming = false; InvokeUI(() => { NavigationManager.NavigateTo(nameof(JobProgressView)); if (_last_failed_job_notification != null) { _last_failed_job_notification.Close(); _last_failed_job_notification = null; } }); } } } private async void MachineOperator_ResumingJob(object sender, ResumingJobEventArgs e) { LogManager.Log($"Job resume request '{e.JobGuid}' approving..."); try { using (ObservablesContext db = ObservablesContext.CreateDefault()) { var job = await new JobBuilder(db).Set(e.JobGuid).WithRML(null).WithConfiguration().WithSegments().WithBrushStops().BuildAsync(); e.Approve(job); resuming = true; } } catch (Exception ex) { LogManager.Log(ex, "An error occurred while trying to resume the job."); InvokeUI(() => { NotificationProvider.ShowError("An error occurred while trying to resume a job in progress."); }); } } /// /// Handles the PrintingFailed event of the MachineOperator. /// /// The source of the event. /// The instance containing the event data. private void MachineOperator_PrintingFailed(object sender, PrintingFailedEventArgs e) { String message = $"{e.Exception.FlattenMessage()}"; _last_failed_job_notification = NotificationProvider.PushNotification(new MessageNotificationItem( $"'{e.Job.Name}' failed at position {e.JobHandler.Status.ProgressMinusSettingUp.ToString("0.0")} out of {e.JobHandler.Status.TotalProgressMinusSettingUp.ToString("0.0")} meters.", message, MessageNotificationItem.MessageNotificationItemTypes.Error, () => { NavigationManager.NavigateWithObject(e.Job); NavigationManager.ClearHistoryExcept(); }, NotificationItem.NotificationPriority.VeryHigh)); } /// /// Handles the PrintingCompleted event of the MachineOperator. /// /// The source of the event. /// The instance containing the event data. private void MachineOperator_PrintingCompleted(object sender, PrintingEventArgs e) { LogManager.Log($"'{e.Job.Name}' printing complete. Job designation is {e.Job.Designation}."); if (e.Job.Designation == BL.Enumerations.JobDesignations.SampleDye) { NotificationProvider.PushNotification(new MessageNotificationItem(String.Format("'{0}' sample dye completed successfully", e.Job.Name), "Tap to approve or repeat.", MessageNotificationItem.MessageNotificationItemTypes.Success, () => { NavigationManager.NavigateWithObject(new JobNavigationObject() { Job = e.Job, Intent = JobNavigationIntent.SampleDye }); NavigationManager.ClearHistoryExcept(); })); } else if (e.Job.Designation == BL.Enumerations.JobDesignations.FineTuning) { //NotificationProvider.PushNotification(new MessageNotificationItem(String.Format("'{0}' fine tuning completed successfully", e.Job.Name), "Tap to approve or repeat.", MessageNotificationItem.MessageNotificationItemTypes.Success, () => //{ // NavigationManager.NavigateWithObject(new JobNavigationObject() { Job = e.Job, Intent = JobNavigationIntent.FineTuning }); // NavigationManager.ClearHistoryExcept(); //})); } else { if (BuildProvider.MachineType.IsXMachine()) { foreach (var item in NotificationProvider.NotificationItems.Where(x => x.CanClose).ToList()) { NotificationProvider.PopNotification(item); } } NotificationProvider.PushNotification(new MessageNotificationItem(String.Format("'{0}' completed successfully", e.Job.Name), "Tap to view this job details.", MessageNotificationItem.MessageNotificationItemTypes.Success, () => { NavigationManager.NavigateWithObject(new JobNavigationObject() { Job = e.Job }); NavigationManager.ClearHistoryExcept(); }, NotificationItem.NotificationPriority.VeryHigh)); } } public override void OnNavigatedTo() { base.OnNavigatedTo(); RaiseMessage(); } } }