コード例 #1
0
        public double GetMouseToKeyboardTransitionCost(KeyDownEvent keyDownEvent)
        {
            PhysicalKey key = FindKey(keyDownEvent.Data);

            if (key != null)
            {
                KeyboardSection parentSection = key.ParentSection;
                if (parentSection.Handedness == Handedness.Right)
                {
                    lastMouseHandedAction = ActionType.Keyboard;
                    if (MousePad == null)
                    {
                        throw new Exception("MousePad not specified.");
                    }
                    if (mousePadCenter.X == double.MinValue)
                    {
                        CalculateMousePadCenterPoint();
                    }

                    double travelDistance      = MillerComplexity.GetDistance(parentSection.Center, mousePadCenter);
                    double targetApproachWidth = MillerComplexity.GetTargetApproachWidth(key.Size.Width, key.Size.Height);
                    return(MillerComplexity.GetTargetPressScore(travelDistance, targetApproachWidth));
                }
            }
            return(0);
        }
コード例 #2
0
ファイル: PhysicalKey.cs プロジェクト: ewin66/StepDiagrammer
        const double DBL_FingerPadRadius = 0.7d; // Average radius of human finger pad, in cm

        public PhysicalKey(string name, Sides exposedEdges, Size size, KeyboardSection parentSection)
        {
            ParentSection = parentSection;
            Size          = size;
            ExposedEdges  = exposedEdges;
            Name          = name;
        }
コード例 #3
0
        KeyboardSection GetEscape()
        {
            KeyboardSection escapeSection = new KeyboardSection(new Point(3.1, 4.3), new Size(2.4, 1.9), Handedness.Left);

            escapeSection.Add(Keys.Escape, Sides.Bottom | Sides.Left | Sides.Right | Sides.Top, KeySize.Escape);
            return(escapeSection);
        }
コード例 #4
0
        /// <summary>
        /// Initializes a new instance of the MicrosoftNaturalKeyboard class.
        /// </summary>
        public MicrosoftNaturalKeyboard()
        {
            KeyboardSection.StandardKeySize = KeySize.StandardKey;

            homeKeysLeft          = GetHomeKeysLeft();
            homeKeysRight         = GetHomeKeysRight();
            punctuationKeysRight  = GetPunctuationKeys();
            extendedKeys          = GetExtendedNavKeys();
            functionKeysRight     = GetFunctionKeysRight();
            numPadKeys            = GetNumPadKeys();
            numPadTopRowOperators = GetNumPadTopRowOperators();
            arrowKeys             = GetArrowKeys();

            keyboardSections.Add(arrowKeys);
            keyboardSections.Add(GetFunctionKeysLeft());
            keyboardSections.Add(functionKeysRight);
            keyboardSections.Add(homeKeysLeft);
            keyboardSections.Add(homeKeysRight);
            keyboardSections.Add(GetNumKeysLeft());
            keyboardSections.Add(GetNumKeysRight());
            keyboardSections.Add(extendedKeys);
            keyboardSections.Add(numPadKeys);
            keyboardSections.Add(numPadTopRowOperators);
            keyboardSections.Add(GetSpaceBar());
            keyboardSections.Add(GetEscape());
            keyboardSections.Add(GetLeftKeyColumn());
            keyboardSections.Add(GetLeftModifiers());
            keyboardSections.Add(GetRightModifiers());
            keyboardSections.Add(GetWebSearchMailKeys());
            keyboardSections.Add(punctuationKeysRight);
        }
コード例 #5
0
        KeyboardSection GetSpaceBar()
        {
            KeyboardSection spaceBarSection = new KeyboardSection(new Point(16.7, 17.2), new Size(14.7, 4.8), Handedness.Both);

            spaceBarSection.Add(Keys.Space, Sides.Bottom, KeySize.Space);
            return(spaceBarSection);
        }
コード例 #6
0
        public double GetReachingForMouseTransitionCost()
        {
            if (MousePad == null)
            {
                throw new Exception("MousePad not specified.");
            }
            if (mousePadCenter.X == double.MinValue)
            {
                CalculateMousePadCenterPoint();
            }
            if (MousePad.Mouse == null)
            {
                throw new Exception("Mouse not specified.");
            }

            KeyboardSection nearestSection = GetLastTouchedSectionClosestToMouse();

            if (nearestSection == null)
            {
                throw new Exception("A keyboard section near the mouse was not found.");
            }

            double travelDistance      = MillerComplexity.GetDistance(nearestSection.Center, mousePadCenter);
            double targetApproachWidth = MousePad.Mouse.Width; // Mouse is nearly always approached from the left or right;

            lastMouseHandedAction = ActionType.Mouse;
            return(MillerComplexity.GetTargetPressScore(travelDistance, targetApproachWidth));
        }
コード例 #7
0
        KeyboardSection GetNumPadTopRowOperators()
        {
            KeyboardSection punctuationKeys = new KeyboardSection(new Point(37.4, 5.9), new Size(5.8, 1.9), Handedness.Right);

            punctuationKeys.Add(Keys.PrintScreen, Sides.Left | Sides.Top | Sides.Bottom);
            punctuationKeys.Add(Keys.Scroll, Sides.Top | Sides.Bottom);
            punctuationKeys.Add(Keys.Pause, Sides.Right | Sides.Top | Sides.Bottom);
            return(punctuationKeys);
        }
コード例 #8
0
        KeyboardSection GetWebSearchMailKeys()
        {
            KeyboardSection webSearchMailKeys = new KeyboardSection(new Point(6.1, 2.2), new Size(6.5, 1.0), Handedness.Left);

            webSearchMailKeys.Add(Keys.BrowserHome, Sides.Left | Sides.Top | Sides.Bottom);
            webSearchMailKeys.Add(Keys.BrowserSearch, Sides.Top | Sides.Bottom);
            webSearchMailKeys.Add(Keys.LaunchMail, Sides.Right | Sides.Top | Sides.Bottom);
            return(webSearchMailKeys);
        }
コード例 #9
0
        KeyboardSection GetRightModifiers()
        {
            KeyboardSection rightModifiers = new KeyboardSection(new Point(28.9, 15.5), new Size(10.0, 5.3), Handedness.Right);

            rightModifiers.Add(Keys.RShiftKey, Sides.Right, KeySize.RightShift);
            rightModifiers.Add(Keys.RControlKey, Sides.Right | Sides.Bottom, KeySize.Ctrl);
            rightModifiers.Add(Keys.Apps, Sides.Bottom, KeySize.ContextMenu);
            rightModifiers.Add(Keys.RMenu, Sides.Bottom, KeySize.RightAlt);
            return(rightModifiers);
        }
コード例 #10
0
        KeyboardSection GetNumKeysRight()
        {
            KeyboardSection numKeysRight = new KeyboardSection(new Point(37.2, 9.2), new Size(5.8, 5.5), Handedness.Right);

            numKeysRight.Add(Keys.D7, Sides.Top | Sides.Left, KeySize.D7);
            numKeysRight.Add(Keys.D8, Sides.Top);
            numKeysRight.Add(Keys.D9, Sides.Top);
            numKeysRight.Add(Keys.D0, Sides.Top);
            return(numKeysRight);
        }
コード例 #11
0
        KeyboardSection GetArrowKeys()
        {
            KeyboardSection arrowKeys = new KeyboardSection(new Point(37.1, 14.7), new Size(6.2, 5.2), Handedness.Right);

            arrowKeys.Add(Keys.Left, Sides.Left | Sides.Top | Sides.Bottom);
            arrowKeys.Add(Keys.Up, Sides.Left | Sides.Top | Sides.Right);
            arrowKeys.Add(Keys.Right, Sides.Bottom | Sides.Top | Sides.Right);
            arrowKeys.Add(Keys.Down, Sides.Bottom);
            return(arrowKeys);
        }
コード例 #12
0
        KeyboardSection GetLeftModifiers()
        {
            KeyboardSection leftModifiers = new KeyboardSection(new Point(5.3, 14.8), new Size(8.6, 6.8), Handedness.Left);

            leftModifiers.Add(Keys.LShiftKey, Sides.Left, KeySize.LeftShift);
            leftModifiers.Add(Keys.LControlKey, Sides.Left | Sides.Bottom, KeySize.Ctrl);
            leftModifiers.Add(Keys.LWin, Sides.Bottom, KeySize.Windows);
            leftModifiers.Add(Keys.LMenu, Sides.Bottom, KeySize.LeftAlt);
            return(leftModifiers);
        }
コード例 #13
0
        KeyboardSection GetLeftKeyColumn()
        {
            KeyboardSection leftKeyColumn = new KeyboardSection(new Point(2.6, 8.2), new Size(3.9, 5.9), Handedness.Left);

            leftKeyColumn.Add(Keys.Oemtilde, Sides.Left | Sides.Top, KeySize.Tilde);
            leftKeyColumn.Add(Keys.Tab, Sides.Left, KeySize.Tab);
            leftKeyColumn.Add(Keys.Capital, Sides.Left, KeySize.CapsLock);
            leftKeyColumn.Add(Keys.CapsLock, Sides.Left, KeySize.CapsLock);

            return(leftKeyColumn);
        }
コード例 #14
0
        KeyboardSection GetFunctionKeysLeft()
        {
            KeyboardSection functionKeysLeft = new KeyboardSection(new Point(10.25, 5.5), new Size(9.4, 3.7), Handedness.Left);

            functionKeysLeft.Add(Keys.F1, Sides.Left | Sides.Top | Sides.Bottom);
            functionKeysLeft.Add(Keys.F2, Sides.Top | Sides.Bottom);
            functionKeysLeft.Add(Keys.F3, Sides.Top | Sides.Bottom);
            functionKeysLeft.Add(Keys.F4, Sides.Top | Sides.Bottom);
            functionKeysLeft.Add(Keys.F5, Sides.Top | Sides.Bottom | Sides.Right);
            return(functionKeysLeft);
        }
コード例 #15
0
        KeyboardSection GetNumKeysLeft()
        {
            KeyboardSection numKeysLeft = new KeyboardSection(new Point(23.3, 12.7), new Size(9.7, 5.5), Handedness.Left);

            numKeysLeft.Add(Keys.D1, Sides.Top);
            numKeysLeft.Add(Keys.D2, Sides.Top);
            numKeysLeft.Add(Keys.D3, Sides.Top);
            numKeysLeft.Add(Keys.D4, Sides.Top);
            numKeysLeft.Add(Keys.D5, Sides.Top);
            numKeysLeft.Add(Keys.D6, Sides.Top | Sides.Right);
            return(numKeysLeft);
        }
コード例 #16
0
        KeyboardSection GetExtendedNavKeys()
        {
            KeyboardSection extendedNavKeys = new KeyboardSection(new Point(23.3, 12.7), new Size(9.7, 4.1), Handedness.Right);

            extendedNavKeys.Add(Keys.Insert, Sides.Top | Sides.Left);
            extendedNavKeys.Add(Keys.Home, Sides.Top);
            extendedNavKeys.Add(Keys.PageUp, Sides.Top | Sides.Right);
            extendedNavKeys.Add(Keys.Delete, Sides.Left | Sides.Bottom);
            extendedNavKeys.Add(Keys.End, Sides.Bottom);
            extendedNavKeys.Add(Keys.PageDown, Sides.Bottom | Sides.Right);
            return(extendedNavKeys);
        }
コード例 #17
0
        KeyboardSection GetFunctionKeysRight()
        {
            KeyboardSection functionKeysRight = new KeyboardSection(new Point(25.4, 6), new Size(13.4, 2.0), Handedness.Right);

            functionKeysRight.Add(Keys.F6, Sides.Left | Sides.Top | Sides.Bottom);
            functionKeysRight.Add(Keys.F7, Sides.Top | Sides.Bottom);
            functionKeysRight.Add(Keys.F8, Sides.Top | Sides.Bottom);
            functionKeysRight.Add(Keys.F9, Sides.Top | Sides.Bottom);
            functionKeysRight.Add(Keys.F10, Sides.Top | Sides.Bottom);
            functionKeysRight.Add(Keys.F11, Sides.Top | Sides.Bottom);
            functionKeysRight.Add(Keys.F12, Sides.Top | Sides.Bottom);
            return(functionKeysRight);
        }
コード例 #18
0
        KeyboardSection GetPunctuationKeys()
        {
            KeyboardSection punctuationKeys = new KeyboardSection(new Point(29.2, 11.0), new Size(9.2, 7.9), Handedness.Right);

            punctuationKeys.Add(Keys.OemPeriod);
            punctuationKeys.Add(Keys.OemQuestion);
            punctuationKeys.Add(Keys.OemMinus, Sides.Top);
            punctuationKeys.Add(Keys.Oemplus, Sides.Top);
            punctuationKeys.Add(Keys.Oemcomma);
            punctuationKeys.Add(Keys.OemOpenBrackets);
            punctuationKeys.Add(Keys.Oem7);
            punctuationKeys.Add(Keys.Oem6);
            punctuationKeys.Add(Keys.Oem5, Sides.Right); // backslash key
            punctuationKeys.Add(Keys.Oem1);
            punctuationKeys.Add(Keys.Back, Sides.Top | Sides.Right, KeySize.Backspace);
            punctuationKeys.Add(Keys.Enter, Sides.Right, KeySize.Enter);
            return(punctuationKeys);
        }
コード例 #19
0
        KeyboardSection GetHomeKeysRight()
        {
            KeyboardSection homeKeysRight = new KeyboardSection(new Point(23.3, 12.7), new Size(9.7, 5.5), Handedness.Right);

            homeKeysRight.Add(Keys.Y, Sides.Left);
            homeKeysRight.Add(Keys.U);
            homeKeysRight.Add(Keys.I);
            homeKeysRight.Add(Keys.O);
            homeKeysRight.Add(Keys.P);

            homeKeysRight.Add(Keys.H, Sides.Left, KeySize.H);
            homeKeysRight.Add(Keys.J);
            homeKeysRight.Add(Keys.K);
            homeKeysRight.Add(Keys.L);

            homeKeysRight.Add(Keys.N, Sides.Left, KeySize.N);
            homeKeysRight.Add(Keys.M);

            return(homeKeysRight);
        }
コード例 #20
0
        PhysicalKey FindKey(string keyName)
        {
            PhysicalKey key;

            if (keyName.Length == 1 && char.IsDigit(keyName, 0))
            {
                keyName = "D" + keyName;
            }

            const string Key_Enter = "Enter";

            if (keyName == Key_Enter && lastRightKeyPressed != null)
            {
                // The Enter key appears twice on the MS Natural keyboard. Find it in the right section based on the closest section of the last key hit.
                KeyboardSection parentSection = lastRightKeyPressed.ParentSection;

                if (parentSection == numPadKeys || parentSection == numPadTopRowOperators)
                {
                    key = numPadKeys.FindKey(Key_Enter);
                }
                else
                {
                    key = punctuationKeysRight.FindKey(Key_Enter);
                }
                if (key != null)
                {
                    return(key);
                }
            }

            foreach (KeyboardSection keyboardSection in keyboardSections)
            {
                key = keyboardSection.FindKey(keyName);
                if (key != null)
                {
                    return(key);
                }
            }

            return(null);
        }
コード例 #21
0
        KeyboardSection GetLastTouchedSectionClosestToMouse()
        {
            KeyboardSection nearestSection = null;

            switch (MousePadPosition)
            {
            case Handedness.Left:
                if (lastLeftKeyPressed != null)
                {
                    nearestSection = lastLeftKeyPressed.ParentSection;
                }
                else
                {
                    nearestSection = homeKeysLeft;
                }
                break;

            case Handedness.Right:
                if (lastRightKeyPressed != null)
                {
                    nearestSection = lastRightKeyPressed.ParentSection;
                }
                else
                {
                    nearestSection = homeKeysRight;
                }
                break;

            case Handedness.Both:
                if (lastAmbidextrousKeyPressed != null)
                {
                    nearestSection = lastAmbidextrousKeyPressed.ParentSection;
                }
                else
                {
                    nearestSection = homeKeysRight;
                }
                break;
            }
            return(nearestSection);
        }
コード例 #22
0
        KeyboardSection GetHomeKeysLeft()
        {
            KeyboardSection homeKeysLeft = new KeyboardSection(new Point(10, 11.85), new Size(9.6, 5.4), Handedness.Left);

            homeKeysLeft.Add(Keys.Q);
            homeKeysLeft.Add(Keys.W);
            homeKeysLeft.Add(Keys.E);
            homeKeysLeft.Add(Keys.R);
            homeKeysLeft.Add(Keys.T, Sides.Right, KeySize.T);

            homeKeysLeft.Add(Keys.A);
            homeKeysLeft.Add(Keys.S);
            homeKeysLeft.Add(Keys.D);
            homeKeysLeft.Add(Keys.F);
            homeKeysLeft.Add(Keys.G, Sides.Right, KeySize.G);

            homeKeysLeft.Add(Keys.Z);
            homeKeysLeft.Add(Keys.X);
            homeKeysLeft.Add(Keys.C);
            homeKeysLeft.Add(Keys.V);
            homeKeysLeft.Add(Keys.B, Sides.Right);

            return(homeKeysLeft);
        }
コード例 #23
0
        KeyboardSection GetNumPadKeys()
        {
            KeyboardSection numPadKeys = new KeyboardSection(new Point(44.4, 12.2), new Size(7.75, 9.6), Handedness.Right);

            numPadKeys.Add(Keys.NumLock, Sides.Left | Sides.Top);
            numPadKeys.Add(Keys.Divide, Sides.Top);
            numPadKeys.Add(Keys.Multiply, Sides.Top);
            numPadKeys.Add(Keys.Subtract, Sides.Top | Sides.Right);
            numPadKeys.Add(Keys.NumPad7, Sides.Left);
            numPadKeys.Add(Keys.NumPad8);
            numPadKeys.Add(Keys.NumPad9);
            numPadKeys.Add(Keys.Add, Sides.Right, KeySize.Add);
            numPadKeys.Add(Keys.NumPad4, Sides.Left);
            numPadKeys.Add(Keys.NumPad5);
            numPadKeys.Add(Keys.NumPad6);
            numPadKeys.Add(Keys.NumPad1, Sides.Left);
            numPadKeys.Add(Keys.NumPad2);
            numPadKeys.Add(Keys.NumPad3);
            numPadKeys.Add(Keys.Enter, Sides.Right | Sides.Bottom, KeySize.NumPadEnter);
            numPadKeys.Add(Keys.NumPad0, Sides.Left | Sides.Bottom, KeySize.NumPad0);
            numPadKeys.Add(Keys.Delete);

            return(numPadKeys);
        }
コード例 #24
0
        /// <summary>
        /// Determines the approximate travel distance between keys by measuring the travel distance
        /// between the parenting sections of the two keys.
        /// </summary>
        double GetApproximateDistanceBetweenKeys(PhysicalKey key1, PhysicalKey key2)
        {
            KeyboardSection section = key2.ParentSection;

            return(GetApproximateDistanceToKey(section, key1));
        }
コード例 #25
0
        /// <summary>
        /// Returns the distance between the center of the specified section to the center of the section
        /// holding the specified key.
        /// </summary>
        double GetApproximateDistanceToKey(KeyboardSection section, PhysicalKey key1)
        {
            double distanceBetweenPoints = GetDistanceBetweenPoints(key1.ParentSection.Center, section.Center);

            return(Math.Max(distanceBetweenPoints, DBL_MinimumDistanceBetweenKeys));
        }