Example #1
0
        void ScalePartAndFixPosition(MouseEventArgs mouseEvent, double scaleAmount)
        {
            Vector2 mousePreScale = new Vector2(mouseEvent.X, mouseEvent.Y);

            TotalTransform.inverse_transform(ref mousePreScale);

            layerScale = scaleAmount;

            Vector2 mousePostScale = new Vector2(mouseEvent.X, mouseEvent.Y);

            TotalTransform.inverse_transform(ref mousePostScale);

            unscaledRenderOffset += (mousePostScale - mousePreScale);
        }
Example #2
0
        public override void OnMouseMove(MouseEventArgs mouseEvent)
        {
            base.OnMouseMove(mouseEvent);
            Vector2 mousePos = new Vector2(mouseEvent.X, mouseEvent.Y);

            if (MouseCaptured)
            {
                Vector2 mouseDelta = mousePos - lastMousePosition;
                switch (TransformState)
                {
                case ETransformState.Move:
                    ScallingTransform.inverse_transform(ref mouseDelta);

                    unscaledRenderOffset += mouseDelta;
                    break;

                case ETransformState.Scale:
                    double zoomDelta = 1;
                    if (mouseDelta.y < 0)
                    {
                        zoomDelta = 1 - (-1 * mouseDelta.y / 100);
                    }
                    else if (mouseDelta.y > 0)
                    {
                        zoomDelta = 1 + (1 * mouseDelta.y / 100);
                    }

                    Vector2 mousePreScale = mouseDownPosition;
                    TotalTransform.inverse_transform(ref mousePreScale);


                    layerScale *= zoomDelta;

                    Vector2 mousePostScale = mouseDownPosition;
                    TotalTransform.inverse_transform(ref mousePostScale);

                    unscaledRenderOffset += (mousePostScale - mousePreScale);
                    break;

                default:
                    throw new NotImplementedException();
                }

                Invalidate();
            }
            lastMousePosition = mousePos;
        }
        public override void OnMouseWheel(MouseEventArgs mouseEvent)
        {
            base.OnMouseWheel(mouseEvent);
            if (FirstWidgetUnderMouse)             // TODO: find a good way to decide if you are what the wheel is trying to do
            {
                Vector2 mousePreScale = new Vector2(mouseEvent.X, mouseEvent.Y);
                TotalTransform.inverse_transform(ref mousePreScale);

                const double deltaFor1Click = 120;
                layerScale = layerScale + layerScale * (mouseEvent.WheelDelta / deltaFor1Click) * .1;

                Vector2 mousePostScale = new Vector2(mouseEvent.X, mouseEvent.Y);
                TotalTransform.inverse_transform(ref mousePostScale);

                unscaledRenderOffset += (mousePostScale - mousePreScale);

                Invalidate();
            }
        }
Example #4
0
        public override void PostProcess(SKRect?viewport, SKMatrix totalMatrix)
        {
            var element = Element;

            if (element is null)
            {
                return;
            }

            var enableOpacity = !IgnoreAttributes.HasFlag(DrawAttributes.Opacity);

            ClipPath     = null;
            MaskDrawable = null;
            Opacity      = enableOpacity ? SvgExtensions.GetOpacityPaint(element) : null;
            Filter       = null;

            TotalTransform    = totalMatrix.PreConcat(Transform);
            TransformedBounds = TotalTransform.MapRect(GeometryBounds);

            foreach (var child in ChildrenDrawables)
            {
                child.PostProcess(viewport, totalMatrix);
            }
        }
Example #5
0
        public override void OnMouseMove(MouseEventArgs mouseEvent)
        {
            base.OnMouseMove(mouseEvent);
            Vector2 mousePos = new Vector2();

            if (mouseEvent.NumPositions == 1)
            {
                mousePos = new Vector2(mouseEvent.X, mouseEvent.Y);
            }
            else
            {
                Vector2 centerPosition = (mouseEvent.GetPosition(1) + mouseEvent.GetPosition(0)) / 2;
                mousePos = centerPosition;
            }
            if (MouseCaptured)
            {
                Vector2 mouseDelta = mousePos - lastMousePosition;
                switch (TransformState)
                {
                case ETransformState.Move:
                    ScalingTransform.inverse_transform(ref mouseDelta);

                    unscaledRenderOffset += mouseDelta;
                    break;

                case ETransformState.Scale:
                    double zoomDelta = 1;
                    if (mouseDelta.y < 0)
                    {
                        zoomDelta = 1 - (-1 * mouseDelta.y / 100);
                    }
                    else if (mouseDelta.y > 0)
                    {
                        zoomDelta = 1 + (1 * mouseDelta.y / 100);
                    }

                    Vector2 mousePreScale = mouseDownPosition;
                    TotalTransform.inverse_transform(ref mousePreScale);

                    layerScale *= zoomDelta;

                    Vector2 mousePostScale = mouseDownPosition;
                    TotalTransform.inverse_transform(ref mousePostScale);

                    unscaledRenderOffset += (mousePostScale - mousePreScale);
                    break;

                default:
                    throw new NotImplementedException();
                }

                Invalidate();
            }
            lastMousePosition = mousePos;

            // check if we should do some scaling
            if (TransformState == ETransformState.Move &&
                mouseEvent.NumPositions > 1 &&
                startDistanceBetweenPoints > 0)
            {
                double curDistanceBetweenPoints = (mouseEvent.GetPosition(1) - mouseEvent.GetPosition(0)).Length;

                double scaleAmount = pinchStartScale * curDistanceBetweenPoints / startDistanceBetweenPoints;
                ScalePartAndFixPosition(mouseEvent, scaleAmount);
            }
        }