private void PerformButtonSlide(CornerButton button, SlideDirections direction, Action postAction)
    {
        var retinaCenter = new Vector2(480, 320);
        var buttonCenter = button.Position + new Vector2((float) button.VirtualRegionOnScreen.width / 2.0f, (float) button.VirtualRegionOnScreen.height / 2.0f );

        var directingVector = buttonCenter - retinaCenter;
        directingVector.Normalize();

        var sign = direction == SlideDirections.Out ? 1 : -1;
        var targetPosition =  buttonCenter + sign * directingVector * ButtonSlideDistance;
        Debug.Log(string.Format("{0}: {1}", button.Symbol, targetPosition));

        //decentralize position
        targetPosition -= new Vector2((float)button.VirtualRegionOnScreen.width / 2.0f, (float)button.VirtualRegionOnScreen.height / 2.0f);
        if (direction == SlideDirections.In) {
            // need to deal with rounding errors
            targetPosition = GetSnapPositionForButton(button);
        }

        // set different easing functions for sliding in and out
        Func<float,float> easingFunc = null;
        if (direction == SlideDirections.Out) {
            easingFunc = (x) => x * x;
        } else {
            easingFunc = (x) => (float)(Math.Log(x) + 2.0f) / 2.0f;
        }

        var controller = new UIElementSlideController(easingFunc) {
            StartPosition = button.Position,
            TargetPosition = targetPosition,
            Duration = TimeSpan.FromMilliseconds(250)
        };

        if (postAction != null) {
            controller.ControllerFinished += (sender, e) => postAction.Invoke();
        }

        button.RemoveController(button.name);
        button.QueueController(button.name, controller);
    }
    private Vector2 GetSnapPositionForButton(CornerButton button)
    {
        EditorDebug.LogWarning("GetSnapPositionsForButton need to be implemented again");
        // left
        if (button.Position.x < 480) {
            if (button.Position.y > 320) {
                button.verticalFloat = Frame.VerticalFloatPositions.bottom;
                button.horizontalFloat = Frame.HorizontalFloatPositions.left;
                button.UpdateElement();
                button.removeFloat();
                //return new Vector2(0, 640 - button.VirtualRegionOnScreen.height);

            } else {
                button.verticalFloat = Frame.VerticalFloatPositions.top;
                button.horizontalFloat = Frame.HorizontalFloatPositions.left;
                button.UpdateElement();
                button.removeFloat();

            }
        } else {
            if (button.Position.y > 320) {
                button.verticalFloat = Frame.VerticalFloatPositions.bottom;
                button.horizontalFloat = Frame.HorizontalFloatPositions.right;
                button.UpdateElement();
                button.removeFloat();
                //return new Vector2(960 - button.VirtualRegionOnScreen.width, 640 - button.VirtualRegionOnScreen.height);
            } else {
                button.verticalFloat = Frame.VerticalFloatPositions.top;
                button.horizontalFloat = Frame.HorizontalFloatPositions.right;
                button.UpdateElement();
                button.removeFloat();
                //return new Vector2(960 - button.VirtualRegionOnScreen.width, 0);
            }
        }
        return button.Position;
    }