示例#1
0
        private void canvas_MouseUp(object sender, MouseEventArgs e)
        {
            if (cameraCapture == CameraCaptureState.None)
            {
                if (!wasFirstClick)
                {
                    if (cube.FindSideByPoint(e.Location, canvas.Scene,
                                             Matrix.Identity, out firstCoords, out firstSide))
                    {
                        wasFirstClick = true;

                        Vector3 cubePosition = CoordsHelper.GetPositionFromCoords(
                            firstCoords, cube.Size);

                        // move cursor by half size of small cube
                        cubePosition += CoordsHelper.GetNormalFromSide(firstSide) / cube.Size;
                        cubePosition  = Vector3.Transform(cubePosition, ref cube.World);

                        rotationCursor.Position = cubePosition;
                        cursorVisible           = true;
                    }
                }
                else
                {
                    CubeCoords secondCoords;
                    CubeSide   secondSide;

                    if (cube.FindSideByPoint(e.Location, canvas.Scene,
                                             Matrix.Identity, out secondCoords, out secondSide))
                    {
                        Rotation rotation = cube.CreateRotationFromSides(
                            firstCoords, firstSide, secondCoords, secondSide);

                        if (rotation != null)
                        {
                            rotationsToApply.Enqueue(rotation);
                        }

                        wasFirstClick = false;
                        cursorVisible = false;
                    }
                }
            }

            cameraCapture = CameraCaptureState.None;
            this.Cursor   = Cursors.Default;
        }
示例#2
0
        private void CopyToClipboard()
        {
            StringBuilder result = new StringBuilder();

            var dataCube = cube.GetCurrentState();

            for (var side = CubeSide.Left; side <= CubeSide.Back; side++)
            {
                result.Append('(');

                foreach (var coords in CoordsHelper.EnumerateSide(side, cube.Size))
                {
                    result.Append(dataCube[coords][side]);
                }

                result.Append(')');
            }

            Clipboard.SetText(result.ToString());
        }
示例#3
0
        private bool PasteFromClipboard()
        {
            string text = Clipboard.GetText();

            if (text.Length == 0)
            {
                return(false);
            }

            var dataCube = RubiksCube.GetDefaultCube(cube.Size);

            // cune has 6 sides
            int[][] sides = new int[6][];
            int     index = 0;

            for (int i = 0; i < sides.Length; i++)
            {
                int openBracket = text.IndexOf('(', index);
                if (openBracket == -1)
                {
                    return(false);
                }

                int closeBracket = text.IndexOf(')', openBracket + 1);
                if (closeBracket == -1)
                {
                    return(false);
                }

                index = closeBracket + 1;

                string colors = text.Substring(
                    openBracket + 1, closeBracket - openBracket - 1);
                colors = new string(colors.ToCharArray()
                                    .Where(ch => char.IsDigit(ch)).ToArray());

                // cube side has 3x3 elements
                if (colors.Length != cube.Size * cube.Size)
                {
                    return(false);
                }

                sides[i] = new int[colors.Length];
                for (int j = 0; j < colors.Length; j++)
                {
                    char digit = colors[j];
                    if (digit < '1' || digit > '6')
                    {
                        return(false);
                    }

                    sides[i][j] = (int)(digit - '0');
                }
            }

            // check that remainder part of text is whitespace chars
            for (; index < text.Length; index++)
            {
                if (!char.IsWhiteSpace(text[index]))
                {
                    return(false);
                }
            }

            for (int i = 0; i < sides.Length; i++)
            {
                var side = (CubeSide)i;

                int j = 0;
                foreach (var coords in CoordsHelper.EnumerateSide(side, cube.Size))
                {
                    dataCube[coords][side] = sides[i][j];
                    j++;
                }
            }

            cube.ReplaceCube(dataCube);
            return(true);
        }