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; }
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()); }
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); }