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); } } }