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); }
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); }
protected override bool OnGrabBrokenEvent(Gdk.EventGrabBroken evnt) { if (MouseGrabNode != null) { MouseGrabNode.GrabBroken(); MouseGrabNode = null; } return(base.OnGrabBrokenEvent(evnt)); }
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)); }