This repository was archived by the owner on Apr 10, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathKeyTapManager.cs
106 lines (79 loc) · 2.5 KB
/
KeyTapManager.cs
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
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using KeyTap.Providers;
using Newtonsoft.Json;
namespace KeyTap
{
[JsonObject(MemberSerialization.OptIn)]
public sealed class KeyTapManager
: INotifyPropertyChanged, IDisposable, IKeyTapEventProvider
{
#region ListenState
private KeyTapListenState _listenState = KeyTapListenState.Off;
public KeyTapListenState ListenState
{
get => _listenState;
set
{
_listenState = value;
OnPropertyChanged();
}
}
#endregion
#region Providers
private readonly IKeyTapProvider[] _providers;
#endregion
#region Keylist
[JsonProperty]
public ObservableCollection<TapKey> KeyList { get; }
#endregion
#region Constructor
public KeyTapManager()
{
KeyList = new ObservableCollection<TapKey>();
KeyList.CollectionChanged += (sender, args) => OnPropertyChanged(nameof(KeyList));
_providers = new IKeyTapProvider[]
{
new KeyboardProvider(this),
new MIDIProvider(this),
};
foreach (IKeyTapProvider provider in _providers)
{
provider.KeyDown += ProviderOnKeyDown;
provider.KeyUp += ProviderOnKeyUp;
}
}
#endregion
#region Key Events
public event EventHandler<TapKey> KeyDown;
public event EventHandler<TapKey> KeyUp;
private void ProviderOnKeyDown(object sender, TapKey e) => KeyDown?.Invoke(this, e);
private void ProviderOnKeyUp(object sender, TapKey e) => KeyUp?.Invoke(this, e);
#endregion
#region PropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
#region Dispose
public void Dispose()
{
foreach (IKeyTapProvider provider in _providers) provider.Dispose();
}
#endregion
}
public enum KeyTapListenState
{
Off = 0,
ListOnly = 1,
All = 2
}
}