public void Grab() { var layout = _guiElement.GetLayout(); // create the container where we will move the draggable inside and where we create highlight for drop targets DragAndDropStage = new Canvas(); _guiElement.GetStage().AddChild(DragAndDropStage); // replace the guiElement with a spacer while it is draggeed Replacer = new Spacer(layout.GetCalculatedWidth(), layout.GetCalculatedHeight()); _guiElement.GetParent().ReplaceChild(_guiElement, Replacer); OriginalPosition = new Vector2(layout.X, layout.Y); var absoluteGeometry = _guiElement.GetLayoutProcessingData().AbsoluteGeometry; layout.X = absoluteGeometry.X; layout.Y = absoluteGeometry.Y; // add the draggable on to the DragAndDropStage DragAndDropStage.AddChild(_guiElement); MousePosInComponent = new Point( GuiStage.MousePosition.X - layout.X, GuiStage.MousePosition.Y - layout.Y ); }
private void ProcessComponentInputs(IGuiElement component, IRectangle clipRect) { // does the element have mouse processing enabled? if (!component.GetMouseEnabled()) { return; } var processingData = component.GetLayoutProcessingData(); // is the mouse actually hovering over the element var containsCurrent = processingData.AbsoluteGeometry.Contains(GuiStage.MousePosition) && clipRect.Contains(GuiStage.MousePosition) && component.GetLayout().Visible ; // was it hovering over the element in the last frame var containsPrevious = processingData.MouseWasOver; // remember the current situation for the next frame processingData.MouseWasOver = containsCurrent; if (containsCurrent) { _result.GuiElementsUnderMouse.Add(component); } // check for mouse over if (containsCurrent && !containsPrevious) { _result.MouseOverEvent.Add(component); } // check for mouse out if (!containsCurrent && containsPrevious) { _result.MouseOutEvent.Add(component); } // check for clicks if (containsCurrent) { // check for left mouse down if (!_previousMouseButtonLeft && _currentMouseButtonLeft) { _result.LeftMouseDownEvent.Add(component); } // check for left mouse up / clicked if (_previousMouseButtonLeft && !_currentMouseButtonLeft) { _result.LeftMouseUpEvent.Add(component); _result.ClickedEvent.Add(component); // detect double click var now = DateTime.Now; if ((now - processingData.LastClickTimestamp).TotalMilliseconds < 500) { _result.DoubleClickedEvent.Add(component); } // remember the last click time processingData.LastClickTimestamp = DateTime.Now; } // check for right mouse down if (!_previousMouseButtonRight && _currentMouseButtonRight) { _result.RightMouseDownEvent.Add(component); } // check for right mouse up if (_previousMouseButtonRight && !_currentMouseButtonRight) { _result.RightMouseUpEvent.Add(component); } // check for middle mouse down if (!_previousMouseButtonMiddle && _currentMouseButtonMiddle) { _result.MiddleMouseDownEvent.Add(component); } // check for right mouse up if (_previousMouseButtonMiddle && !_currentMouseButtonMiddle) { _result.MiddleMouseUpEvent.Add(component); } } }