예제 #1
0
파일: Canvas.cs 프로젝트: nagyistge/Canvas
        protected override bool OnButtonPressEvent(Gdk.EventButton evnt)
        {
            int x       = (int)evnt.X;
            int y       = (int)evnt.Y;
            var element = engine.InputNodeAt(root, x, y);

            HasFocus = true;

            MouseGrabNode = element;
            if (MouseGrabNode != null)
            {
                MouseGrabNode.CancelAnimations();
                DragStart = new Gdk.Point(x, y);

                double dx    = x;
                double dy    = y;
                var    point = engine.TransformPoint(MouseGrabNode.Parent, dx, dy);
                DragOffset = new Gdk.Point((int)(point.X - MouseGrabNode.X), (int)(point.Y - MouseGrabNode.Y));

                var transformedPoint = engine.TransformPoint(MouseGrabNode, x, y);
                MouseGrabNode.ButtonPress(new ButtonEventArgs(transformedPoint.X, transformedPoint.Y, evnt.XRoot, evnt.YRoot, evnt.Button, (ModifierType)evnt.State));
            }

            return(true);
        }
예제 #2
0
파일: Canvas.cs 프로젝트: nagyistge/Canvas
        protected override bool OnButtonReleaseEvent(Gdk.EventButton evnt)
        {
            int x = (int)evnt.X;
            int y = (int)evnt.Y;

            if (MouseGrabNode != null)
            {
                var element = engine.InputNodeAt(root, x, y);
                var point   = engine.TransformPoint(MouseGrabNode, x, y);
                MouseGrabNode.ButtonRelease(new ButtonEventArgs(point.X, point.Y, evnt.XRoot, evnt.YRoot, evnt.Button, (ModifierType)evnt.State));

                if (element == MouseGrabNode && !dragging)
                {
                    element.Activated();
                    if (element.CanFocus)
                    {
                        FocusedNode = element;
                    }
                }
            }

            dragging      = false;
            MouseGrabNode = null;
            return(true);
        }
예제 #3
0
파일: Canvas.cs 프로젝트: nagyistge/Canvas
 protected override bool OnGrabBrokenEvent(Gdk.EventGrabBroken evnt)
 {
     if (MouseGrabNode != null)
     {
         MouseGrabNode.GrabBroken();
         MouseGrabNode = null;
     }
     return(base.OnGrabBrokenEvent(evnt));
 }
예제 #4
0
파일: Canvas.cs 프로젝트: nagyistge/Canvas
        protected override bool OnMotionNotifyEvent(Gdk.EventMotion evnt)
        {
            double dx = evnt.X;
            double dy = evnt.Y;

            if (MouseGrabNode != null)
            {
                if (MouseGrabNode.Draggable && evnt.State.HasFlag(Gdk.ModifierType.Button1Mask))
                {
                    if (!dragging && (Math.Abs(DragStart.X - dx) > 5 || Math.Abs(DragStart.Y - dy) > 5))
                    {
                        dragging = true;
                    }

                    if (dragging)
                    {
                        var point = engine.TransformPoint(MouseGrabNode.Parent, dx, dy);
                        MouseGrabNode.X = point.X - DragOffset.X;
                        MouseGrabNode.Y = point.Y - DragOffset.Y;
                        QueueDraw();
                    }
                }
                else
                {
                    var point = engine.TransformPoint(MouseGrabNode, evnt.X, evnt.Y);
                    MouseGrabNode.MouseMotion(point.X, point.Y, (ModifierType)evnt.State);
                }
            }
            else
            {
                HoveredNode = engine.InputNodeAt(root, evnt.X, evnt.Y);
                if (HoveredNode != null)
                {
                    var point = engine.TransformPoint(HoveredNode, evnt.X, evnt.Y);
                    HoveredNode.MouseMotion(point.X, point.Y, (ModifierType)evnt.State);
                }
            }

            return(base.OnMotionNotifyEvent(evnt));
        }