예제 #1
0
        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);
        }
예제 #2
0
        private bool EvaluateCorrectness(IHardwareKeyMappingTarget pressedKey)
        {
            var isCorrect = pressedKey.Equals(NextExpectedMappingTarget);

            return(isCorrect);
        }