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
                );
        }
Beispiel #2
0
        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);
                }
            }
        }