Esempio n. 1
0
        public static void Update(VisualElementRenderer renderer)
        {
            ElementPositions.Clear();

            XnaMouseState state;
            try
            {
                if (!Forms.Game.IsActive)
                    return;
                state = XnaMouse.GetState();
            }
            catch (InvalidOperationException) { return; }

            var buttonState = UpdateButtonsState(state);

            var reallyOver = renderer.FlattenHierarchyReverse()
                .Where(c => !c.Model.InputTransparent && c.Model.IsEnabled)
                .Select(c => new ElementPosition { Element = c, Position = state.ToRelative(c) })
                .Where(c => c.IsPositionInside());

            var newOver = reallyOver.FirstOrDefault();
            var newOverEventArgs = newOver.Element != null? new MouseEventArgs(state.ToRelative(newOver.Element)) : null;

            if (newOver.Element != null)
            {
                foreach(var stateChange in buttonStateChange)
                {
                    if (stateChange.Value != null)
                    {
                        if (stateChange.Value == XnaButtonState.Pressed)
                        {
                            newOver.Element.HandleRaise(
                                r => new MouseButtonEventArgs(stateChange.Key, state.ToRelative(r)),
                                (r, e) => r.InterceptMouseDown(e),
                                (r, e) => r.HandleMouseDown(e));
                        }
                        else
                            newOver.Element.HandleRaise(
                                r => new MouseButtonEventArgs(stateChange.Key, state.ToRelative(r)),
                                (r, e) => r.InterceptMouseUp(e),
                                (r, e) => r.HandleMouseUp(e));
                    }
                }
            }

            if (_pressing == null)
            {
                if (newOver.Position != null)
                    newOver.Element.OnMouseOver(newOverEventArgs);

                if (_over != newOver.Element)
                {
                    if (_over != null)
                        _over.OnMouseLeave(new MouseEventArgs(state.ToRelative(_over)));
                    if (newOver.Element != null)
                        newOver.Element.OnMouseEnter(newOverEventArgs);

                    _over = newOver.Element;
                }

                if (_over != null && state.LeftButton == XnaButtonState.Pressed)
                {
                    _pressing = _over;
                }
            }
            else
            {
                var pressingEvent = new MouseEventArgs(state.ToRelative(_pressing));
                _pressing.OnMouseOver(pressingEvent);

                if (state.LeftButton == XnaButtonState.Released)
                {
                    if (newOver.Element == _pressing)
                    {
                        _pressing.RaiseClick(newOverEventArgs);
                        _pressing = null;
                    }
                    else
                    {
                        _pressing.OnMouseLeave(pressingEvent);
                        _pressing = null;

                        if (newOver.Element != null)
                            newOver.Element.OnMouseEnter(newOverEventArgs);

                        _over = newOver.Element;
                    }
                }
            }
        }