aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LayoutViewVM.cs
blob: 2bb4e928671c12bac3b82925def0af0faa537c7d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
generated by cgit v1.3.1 (git 2.54.0) at 2026-07-16 19:06:42 +0000
 



.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Threading;
using Tango.Core.Commands;
using Tango.Core.DI;
using Tango.Integration.Operation;
using Tango.PPC.Common;
using Tango.PPC.Common.Modules;
using Tango.PPC.Common.Navigation;
using Tango.PPC.UI.Views;
using Tango.PPC.UI.ViewsContracts;
using Tango.SharedUI;

namespace Tango.PPC.UI.ViewModels
{
    /// <summary>
    /// Represents the layout view containing the main menu and all modules.
    /// </summary>
    /// <seealso cref="Tango.PPC.Common.PPCViewModel{Tango.PPC.UI.ViewsContracts.ILayoutView}" />
    public class LayoutViewVM : PPCViewModel<ILayoutView>
    {
        private JobHandler _jobHandler;
        private bool _resettingDevice;

        /// <summary>
        /// Gets or sets the module loader.
        /// </summary>
        [TangoInject]
        public IPPCModuleLoader ModuleLoader { get; set; }

        #region Properties

        private bool _isMenuOpened;
        /// <summary>
        /// Gets or sets a value indicating whether the side menu is opened.
        /// </summary>
        public bool IsMenuOpened
        {
            get { return _isMenuOpened; }
            set
            {
                _isMenuOpened = value; RaisePropertyChangedAuto();

                if (!_isMenuOpened)
                {
                    IsPowerOpened = false;
                }
            }
        }

        private bool _isNotificationsOpened;
        /// <summary>
        /// Gets or sets a value indicating whether to display all notifications.
        /// </summary>
        public bool IsNotificationsOpened
        {
            get { return _isNotificationsOpened; }
            set
            {
                _isNotificationsOpened = value; RaisePropertyChangedAuto();
            }
        }

        private bool _isPowerOpened;
        /// <summary>
        /// Gets or sets a value indicating whether the power area is opened.
        /// </summary>
        public bool IsPowerOpened
        {
            get { return _isPowerOpened; }
            set { _isPowerOpened = value; RaisePropertyChangedAuto(); }
        }

        #endregion

        #region Commands

        /// <summary>
        /// Gets or sets the module navigation command.
        /// </summary>
        public RelayCommand<String> ModuleNavigationCommand { get; set; }

        /// <summary>
        /// Gets or sets the menu or back command.
        /// </summary>
        public RelayCommand MenuOrBackCommand { get; set; }

        /// <summary>
        /// Gets or sets the home command.
        /// </summary>
        public RelayCommand HomeCommand { get; set; }

        /// <summary>
        /// Gets or sets the notifications area pressed command.
        /// </summary>
        public RelayCommand NotificationsAreaPressedCommand { get; set; }

        /// <summary>
        /// Gets or sets the stop printing command.
        /// </summary>
        public RelayCommand StopPrintingCommand { get; set; }

        /// <summary>
        /// Gets or sets the sign-out command.
        /// </summary>
        public RelayCommand SignOutCommand { get; set; }

        /// <summary>
        /// Gets or sets the update command.
        /// </summary>
        public RelayCommand UpdateCommand { get; set; }

        /// <summary>
        /// Gets or sets the power command.
        /// </summary>
        public RelayCommand PowerCommand { get; set; }

        /// <summary>
        /// Gets or sets the restart application command.
        /// </summary>
        public RelayCommand RestartApplicationCommand { get; set; }

        /// <summary>
        /// Gets or sets the power off command.
        /// </summary>
        public RelayCommand PowerOffCommand { get; set; }

        /// <summary>
        /// Gets or sets the reset command.
        /// </summary>
        public RelayCommand ResetCommand { get; set; }

        #endregion

        #region Constructors

        /// <summary>
        /// Initializes a new instance of the <see cref="LayoutViewVM"/> class.
        /// </summary>
        public LayoutViewVM()
        {
            ModuleNavigationCommand = new RelayCommand<string>(NavigateToModule);
            HomeCommand = new RelayCommand(NavigateHome);
            MenuOrBackCommand = new RelayCommand(OpenMenuOrNavigateBack);
            NotificationsAreaPressedCommand = new RelayCommand(OpenFirstNotificationOrDisplayAll);

            StopPrintingCommand = new RelayCommand(StopPrinting);
            SignOutCommand = new RelayCommand(SignOut);
            UpdateCommand = new RelayCommand(() =>
            {
                NavigationManager.NavigateTo(NavigationView.MachineUpdateView);
                TangoIOC.Default.GetInstance<MachineUpdateViewVM>().CheckForUpdates();
                IsMenuOpened = false;
            });

            PowerCommand = new RelayCommand(() => IsPowerOpened = true);
            RestartApplicationCommand = new RelayCommand(RestartApplication);
            PowerOffCommand = new RelayCommand(PowerOffMachine, () => MachineProvider.MachineOperator.Status != MachineStatuses.Disconnected);
            ResetCommand = new RelayCommand(ResetMachine, () => MachineProvider.MachineOperator.Status != MachineStatuses.Disconnected);
        }

        #endregion

        #region Private Methods

        /// <summary>
        /// Stops the printing.
        /// </summary>
        private void StopPrinting()
        {
            LogManager.Log("Stop printing layout command pressed!");

            if (_jobHandler != null)
            {
                _jobHandler.Cancel();
            }
        }

        /// <summary>
        /// Opens the menu or navigate back.
        /// </summary>
        private void OpenMenuOrNavigateBack()
        {
            if (NavigationManager.CanNavigateBack)
            {
                LogManager.Log("Back command pressed.");
                NavigationManager.NavigateBack();
            }
            else
            {
                LogManager.Log("Menu command pressed.");
                IsMenuOpened = true;
            }
        }

        /// <summary>
        /// Handles the module navigation command.
        /// </summary>
        /// <param name="moduleName">Name of the module.</param>
        private void NavigateToModule(string moduleName)
        {
            LogManager.Log("Navigate to module command pressed.");
            IsMenuOpened = false;
            NavigationManager.NavigateTo(moduleName);
        }

        /// <summary>
        /// Handles the home command.
        /// </summary>
        private void NavigateHome()
        {
            LogManager.Log("Navigate home command pressed.");
            IsMenuOpened = false;
            NavigationManager.NavigateTo(NavigationView.HomeModule);
        }

        /// <summary>
        /// Represents an event that is raised when the sign-out operation is complete.
        /// </summary>
        private void SignOut()
        {
            LogManager.Log("SignOut command pressed.");
            AuthenticationProvider.LogOut();
            IsMenuOpened = false;
        }

        /// <summary>
        /// Opens the first notification or display all.
        /// </summary>
        private void OpenFirstNotificationOrDisplayAll()
        {
            if (NotificationProvider.NotificationItems.Count == 1)
            {
                //Open first
            }
            else
            {
                IsNotificationsOpened = true;
            }
        }

        /// <summary>
        /// Restarts the application.
        /// </summary>
        private async void RestartApplication()
        {
            if (await NotificationProvider.ShowQuestion("Are you sure you want to restart the application?"))
            {
                ApplicationManager.Restart();
            }
        }

        /// <summary>
        /// Powers off the machine.
        /// </summary>
        private async void PowerOffMachine()
        {
            IsMenuOpened = false;

            if (await NotificationProvider.ShowQuestion("Are you sure you wish to turn off the machine?"))
            {
                try
                {
                    await MachineProvider.MachineOperator.PowerDown();
                }
                catch (Exception ex)
                {
                    LogManager.Log(ex, "Error triggering power down.");
                    await NotificationProvider.ShowError(ex.FlattenMessage());
                }
            }
        }

        /// <summary>
        /// Resets the machine.
        /// </summary>
        private async void ResetMachine()
        {
            IsMenuOpened = false;

            if (!await NotificationProvider.ShowQuestion("Are you sure you want to reset the machine?")) return;

            try
            {
                _resettingDevice = true;
                ResetCommand.RaiseCanExecuteChanged();
                await MachineProvider.MachineOperator.Reset();
                await NotificationProvider.ShowInfo("Machine was successfully restarted.");
            }
            catch (Exception ex)
            {
                await NotificationProvider.ShowError(ex.FlattenMessage());
            }
            finally
            {
                _resettingDevice = false;
                ResetCommand.RaiseCanExecuteChanged();
            }
        }

        #endregion

        #region Override Methods

        /// <summary>
        /// Called when the application has been started.
        /// </summary>
        public override void OnApplicationStarted()
        {
            base.OnApplicationStarted();
            MachineProvider.MachineOperator.PrintingStarted += MachineOperator_PrintingStarted;
        }

        /// <summary>
        /// Called when the instance of IPPCView is available.
        /// </summary>
        public override void OnViewAttached()
        {

        }

        public override void OnApplicationReady()
        {
            base.OnApplicationReady();
            MachineProvider.MachineOperator.StatusChanged += MachineOperator_StatusChanged;
        }

        private void MachineOperator_StatusChanged(object sender, MachineStatuses e)
        {
            InvokeUI(() =>
            {
                PowerOffCommand.RaiseCanExecuteChanged();
                ResetCommand.RaiseCanExecuteChanged();
            });
        }

        #endregion

        #region Public Methods

        /// <summary>
        /// Toggles the application technician mode.
        /// </summary>
        public void ToggleTechnicianMode()
        {
            if (!ApplicationManager.IsInTechnicianMode)
            {
                ApplicationManager.EnterTechnicianMode();
            }
            else
            {
                ApplicationManager.ExitTechnicianMode();
            }
        }

        #endregion

        #region Event Handlers

        /// <summary>
        /// Handles the PrintingStarted event of the MachineOperator.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="PrintingEventArgs"/> instance containing the event data.</param>
        private void MachineOperator_PrintingStarted(object sender, PrintingEventArgs e)
        {
            _jobHandler = e.JobHandler;
        }

        #endregion
    }
}