/trunk/WingMan/WingManForm.cs |
@@ -3,10 +3,12 @@ |
using System.Drawing; |
using System.Linq; |
using System.Net; |
using System.Threading; |
using System.Threading.Tasks; |
using System.Windows.Forms; |
using Gma.System.MouseKeyHook; |
using WingMan.Communication; |
using WingMan.Lobby; |
using WingMan.MouseKey; |
using WingMan.Properties; |
|
@@ -19,93 +21,130 @@ |
InitializeComponent(); |
|
FormTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext(); |
FormCancellationTokenSource = new CancellationTokenSource(); |
|
MQTTCommunication = new MQTTCommunication(FormTaskScheduler); |
MQTTCommunication = new MQTTCommunication(FormTaskScheduler, FormCancellationTokenSource.Token); |
|
MouseKeyBindings = new MouseKeyBindings(new List<MouseKeyBinding>()); |
|
HelmBindingSource = new BindingSource |
HelmListBoxBindingSource = new BindingSource |
{ |
DataSource = MouseKeyBindings.Bindings |
}; |
HelmBindingsListBox.DisplayMember = "DisplayName"; |
HelmBindingsListBox.ValueMember = "Keys"; |
HelmBindingsListBox.DataSource = HelmBindingSource; |
HelmBindingsListBox.DataSource = HelmListBoxBindingSource; |
|
MouseKeyBindingsExchange = new MouseKeyBindingsExchange(); |
WingBindingSource = new BindingSource |
MouseKeyBindingsExchange = new MouseKeyBindingsExchange |
{ |
ExchangeBindings = new List<MouseKeyBindingExchange>() |
}; |
|
WingBindingsComboBoxSource = new BindingSource |
{ |
DataSource = MouseKeyBindingsExchange.ExchangeBindings |
}; |
WingBindingsComboBox.DisplayMember = "Nick"; |
WingBindingsComboBox.ValueMember = "Names"; |
WingBindingsComboBox.DataSource = WingBindingSource; |
WingBindingsComboBox.ValueMember = "MouseKeyBindings"; |
WingBindingsComboBox.DataSource = WingBindingsComboBoxSource; |
|
// Start lobby message synchronizer. |
LobbyMessageSynchronizer = new LobbyMessageSynchronizer(MQTTCommunication); |
LobbyMessageSynchronizer = new LobbyMessageSynchronizer(MQTTCommunication, FormTaskScheduler, |
FormCancellationTokenSource.Token); |
LobbyMessageSynchronizer.OnLobbyMessageReceived += OnLobbyMessageReceived; |
|
// Start mouse key bindings synchronizer. |
MouseKeyBindingsSynchronizer = new MouseKeyBindingsSynchronizer(MouseKeyBindings, MQTTCommunication); |
MouseKeyBindingsSynchronizer = new MouseKeyBindingsSynchronizer(MouseKeyBindings, MQTTCommunication, |
FormTaskScheduler, FormCancellationTokenSource.Token); |
MouseKeyBindingsSynchronizer.OnMouseKeyBindingsSynchronized += OnMouseKeyBindingsSynchronized; |
} |
|
private void OnMouseKeyBindingsSynchronized(object sender, MouseKeyBindingsSynchronizedEventArgs e) |
{ |
foreach (var binding in e.ExchangeBindings) |
{ |
ActivityTextBox.AppendText( |
$"{Strings.Synchronized_bindings_with_client} : {binding.Nick} : {binding.Names.Count}{Environment.NewLine}"); |
private static CancellationTokenSource FormCancellationTokenSource { get; set; } |
|
private static TaskScheduler FormTaskScheduler { get; set; } |
|
var exchangeBindings = MouseKeyBindingsExchange.ExchangeBindings.FirstOrDefault(exchangeBinding => |
string.Equals(exchangeBinding.Nick, binding.Nick, StringComparison.Ordinal)); |
private static IKeyboardMouseEvents MouseKeyApplicationHook { get; set; } |
|
// If the nick has not been registered add it. |
if (exchangeBindings == null) |
{ |
MouseKeyBindingsExchange.ExchangeBindings.Add(binding); |
continue; |
} |
private List<string> MouseKeyCombo { get; set; } |
|
// If the nick has been added, then update the binding names. |
exchangeBindings.Names = binding.Names; |
private MouseKeyBindings MouseKeyBindings { get; } |
|
// Update wing list box. |
var selectedExchangeBinding = (MouseKeyBindingExchange) WingBindingsComboBox.SelectedItem; |
if (selectedExchangeBinding == null || !string.Equals(selectedExchangeBinding.Nick, binding.Nick)) |
continue; |
private BindingSource HelmListBoxBindingSource { get; } |
|
WingBindingsListBox.Items.Clear(); |
WingBindingsListBox.DisplayMember = "Name"; |
WingBindingsListBox.ValueMember = "Name"; |
WingBindingsListBox.Items.AddRange(exchangeBindings.Names.Select(name => (object) name).ToArray()); |
private BindingSource WingBindingsComboBoxSource { get; } |
|
private MouseKeyBindingsExchange MouseKeyBindingsExchange { get; } |
|
public MQTTCommunication MQTTCommunication { get; set; } |
|
public LobbyMessageSynchronizer LobbyMessageSynchronizer { get; set; } |
|
public MouseKeyBindingsSynchronizer MouseKeyBindingsSynchronizer { get; set; } |
|
/// <summary> |
/// Clean up any resources being used. |
/// </summary> |
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> |
protected override void Dispose(bool disposing) |
{ |
if (disposing && components != null) |
{ |
FormCancellationTokenSource.Dispose(); |
FormCancellationTokenSource = null; |
|
components.Dispose(); |
} |
|
WingBindingSource.ResetBindings(false); |
base.Dispose(disposing); |
} |
|
private static TaskScheduler FormTaskScheduler { get; set; } |
private void OnMouseKeyBindingsSynchronized(object sender, MouseKeyBindingsSynchronizedEventArgs e) |
{ |
ActivityTextBox.AppendText( |
$"{Strings.Synchronized_bindings_with_client} : {e.Bindings.Nick} : {e.Bindings.MouseKeyBindings.Count}{Environment.NewLine}"); |
|
private static IKeyboardMouseEvents MouseKeyApplicationHook { get; set; } |
var exchangeBindings = MouseKeyBindingsExchange.ExchangeBindings.FirstOrDefault(exchangeBinding => |
string.Equals(exchangeBinding.Nick, e.Bindings.Nick, StringComparison.Ordinal)); |
|
private List<string> MouseKeyCombo { get; set; } |
// If the nick does not exist then add it. |
if (exchangeBindings == null) |
{ |
MouseKeyBindingsExchange.ExchangeBindings.Add(e.Bindings); |
WingBindingsComboBoxSource.ResetBindings(false); |
UpdateWingListBoxItems(); |
return; |
} |
|
private MouseKeyBindings MouseKeyBindings { get; } |
// If the bindings for the nick have not changed then do not update. |
if (exchangeBindings.MouseKeyBindings.SequenceEqual(e.Bindings.MouseKeyBindings)) |
{ |
WingBindingsComboBoxSource.ResetBindings(false); |
UpdateWingListBoxItems(); |
return; |
} |
|
private BindingSource HelmBindingSource { get; } |
// Update the bindings. |
exchangeBindings.MouseKeyBindings = e.Bindings.MouseKeyBindings; |
WingBindingsComboBoxSource.ResetBindings(false); |
UpdateWingListBoxItems(); |
} |
|
private BindingSource WingBindingSource { get; set; } |
private void UpdateWingListBoxItems() |
{ |
var exchangeBinding = (List<MouseKeyBinding>) WingBindingsComboBox.SelectedValue; |
if (exchangeBinding == null) |
return; |
|
private MouseKeyBindingsExchange MouseKeyBindingsExchange { get; set; } |
WingBindingsListBox.Items.Clear(); |
WingBindingsListBox.DisplayMember = "Name"; |
WingBindingsListBox.ValueMember = "Name"; |
var i = exchangeBinding.Select(binding => (object) binding.Name).ToArray(); |
if (i.Length == 0) |
return; |
|
public MQTTCommunication MQTTCommunication { get; set; } |
WingBindingsListBox.Items.AddRange(i); |
} |
|
public LobbyMessageSynchronizer LobbyMessageSynchronizer { get; set; } |
|
public MouseKeyBindingsSynchronizer MouseKeyBindingsSynchronizer { get; set; } |
|
private void OnLobbyMessageReceived(object sender, LobbyMessageReceivedEventArgs e) |
{ |
LobbyTextBox.Invoke((MethodInvoker) delegate |
@@ -265,7 +304,7 @@ |
{ |
MouseKeyBindings.Bindings.Add(new MouseKeyBinding(HelmNameTextBox.Text, MouseKeyCombo)); |
|
HelmBindingSource.ResetBindings(false); |
HelmListBoxBindingSource.ResetBindings(false); |
|
MouseKeyApplicationHook.KeyDown -= MouseKeyHookOnKeyDown; |
MouseKeyApplicationHook.KeyUp -= MouseKeyHookOnKeyUp; |
@@ -282,7 +321,7 @@ |
{ |
MouseKeyBindings.Bindings.Add(new MouseKeyBinding(HelmNameTextBox.Text, MouseKeyCombo)); |
|
HelmBindingSource.ResetBindings(false); |
HelmListBoxBindingSource.ResetBindings(false); |
|
MouseKeyApplicationHook.KeyDown -= MouseKeyHookOnKeyDown; |
MouseKeyApplicationHook.KeyUp -= MouseKeyHookOnKeyUp; |
@@ -320,7 +359,7 @@ |
return; |
|
MouseKeyBindings.Bindings.Remove(helmBinding); |
HelmBindingSource.ResetBindings(false); |
HelmListBoxBindingSource.ResetBindings(false); |
} |
|
private async void LobbySayButtonClick(object sender, EventArgs e) |
@@ -332,14 +371,7 @@ |
|
private void WingBindingsComboBoxSelectionChangeCompleted(object sender, EventArgs e) |
{ |
var exchangeBinding = (MouseKeyBindingExchange)WingBindingsComboBox.SelectedItem; |
if (exchangeBinding == null) |
return; |
|
WingBindingsListBox.Items.Clear(); |
WingBindingsListBox.DisplayMember = "Name"; |
WingBindingsListBox.ValueMember = "Name"; |
WingBindingsListBox.Items.AddRange(exchangeBinding.Names.Select(name => (object)name).ToArray()); |
UpdateWingListBoxItems(); |
} |
} |
} |