public KeyCorrectness EvaluateKeyUp(IHardwareKeyMappingTarget pressedKey) { var sequenceChanged = false; var currentIndex = _pressedSequence.Count; // Index of the current press in the list (after it's added) var isCorrectKey = EvaluateCorrectness(pressedKey); KeyCorrectness correctness; if (isCorrectKey) { _pressedSequence.Add(pressedKey); SetCorrectness(currentIndex, true); sequenceChanged = true; correctness = KeyCorrectness.Correct; } else { var isBackspace = pressedKey.HardwareKey == HardwareKey.Backspace && pressedKey.Modifiers == Modifier.None; var isOtherKeyPressedPreviously = PressedSequence.Count > 0; var isBackspaceToDeleteLastEntry = isBackspace && isOtherKeyPressedPreviously; if (isBackspaceToDeleteLastEntry && AllowCorrections) { var indexToRemove = _pressedSequence.Count - 1; SetCorrectness(indexToRemove, true); correctness = KeyCorrectness.Indeterminate; _pressedSequence.RemoveAt(indexToRemove); sequenceChanged = true; } else { // Special case: if only modifier keys are pressed, ignore it and don't count it as a wrong input var onlyModifiers = pressedKey.HardwareKey.IsModifier(); if (!onlyModifiers) { // Add it (wrong input input...) _pressedSequence.Add(pressedKey); SetCorrectness(currentIndex, false); sequenceChanged = true; correctness = KeyCorrectness.Wrong; } else { correctness = KeyCorrectness.Indeterminate; } } } if (sequenceChanged) { PressedSequenceChanged?.Invoke(this); } return(correctness); }
private bool EvaluateCorrectness(IHardwareKeyMappingTarget pressedKey) { var isCorrect = pressedKey.Equals(NextExpectedMappingTarget); return(isCorrect); }