aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC/Modules/Tango.PPC.Events/ViewModels/MainViewVM.cs
blob: 326c787875dd2599861a2829965c665e8288e989 (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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.BL.Entities;
using Tango.BL.Enumerations;
using Tango.PPC.Common;
using Tango.PPC.Common.Notifications;
using Tango.PPC.Common.Notifications.NotificationItems;

namespace Tango.PPC.Events.ViewModels
{
    /// <summary>
    /// Represents the main view VM and entry point for <see cref="Events.EventsModule"/>.
    /// </summary>
    /// <seealso cref="Tango.PPC.Common.PPCViewModel" />
    public class MainViewVM : PPCViewModel
    {
        private Dictionary<EventTypes, NotificationItem> _notifications;

        private ObservableCollection<MachinesEvent> _currentEvents;
        /// <summary>
        /// Gets or sets the current events.
        /// </summary>
        public ObservableCollection<MachinesEvent> CurrentEvents
        {
            get { return _currentEvents; }
            set { _currentEvents = value; RaisePropertyChangedAuto(); }
        }

        /// <summary>
        /// Initializes a new instance of the <see cref="MainViewVM"/> class.
        /// </summary>
        public MainViewVM()
        {
            CurrentEvents = new ObservableCollection<MachinesEvent>();
            _notifications = new Dictionary<EventTypes, NotificationItem>();
        }

        /// <summary>
        /// Called when the application has been started
        /// </summary>
        public override void OnApplicationStarted()
        {
            EventLogger.EventReceived += EventLogger_EventReceived;
            EventLogger.EventResolved += EventLogger_EventResolved;
        }

        private void EventLogger_EventReceived(object sender, MachinesEvent ev)
        {
            InvokeUI(() =>
            {
                if (ev.Group != EventTypesGroups.Transport)
                {
                    CurrentEvents.Insert(0, ev);

                    if (ev.Group != EventTypesGroups.Application && ev.Group != EventTypesGroups.Transport)
                    {
                        var notificationItem = new MessageNotificationItem();
                        notificationItem.CanClose = false;
                        notificationItem.Message = ev.EventType.Description;
                        notificationItem.ExpandedMessage = ev.Description;
                        notificationItem.Pressed += (_, __) =>
                        {
                            NotificationProvider.ShowInfo($"{ev.EventType.Description} Selected !");
                        };

                        switch (ev.Category)
                        {
                            case EventTypesCategories.Info:
                                notificationItem.MessageType = MessageNotificationItem.MessageNotificationItemTypes.Info;
                                break;
                            case EventTypesCategories.Warning:
                                notificationItem.MessageType = MessageNotificationItem.MessageNotificationItemTypes.Warning;
                                break;
                            case EventTypesCategories.Error:
                                notificationItem.MessageType = MessageNotificationItem.MessageNotificationItemTypes.Error;
                                break;
                            case EventTypesCategories.Critical:
                                notificationItem.MessageType = MessageNotificationItem.MessageNotificationItemTypes.Error;
                                break;
                        }

                        NotificationProvider.PushNotification(notificationItem);
                        _notifications.Add(ev.EventType.Type, notificationItem);
                    }
                }
            });
        }

        private void EventLogger_EventResolved(object sender, MachinesEvent ev)
        {
            InvokeUI(() =>
            {
                if (ev.Group != EventTypesGroups.Transport)
                {
                    CurrentEvents.Remove(ev);

                    if (ev.Group != EventTypesGroups.Application && ev.Group != EventTypesGroups.Transport)
                    {
                        if (_notifications.ContainsKey(ev.EventType.Type))
                        {
                            var notification = _notifications[ev.EventType.Type];
                            _notifications.Remove(ev.EventType.Type);
                            NotificationProvider.PopNotification(notification);
                        }
                    }
                }
            });
        }
    }
}