/// <summary> /// Register new Actions triggered by a Mouse event /// </summary> /// <param name="action">The action</param> /// <param name="inputActivationMode">The input mode that will be needed to make this action fired</param> /// <param name="bindingKey">The keybard binding</param> public void AddActions(MouseTriggeredAction mouseAction, bool rebind = false) { if (rebind) { //Remove the previously added Action int nbr = _mouseActions.RemoveAll(x => x.ActionId == mouseAction.ActionId && x.TriggerType == mouseAction.TriggerType); logger.Warn("Rebinded MouseBinding remove more than one action : {0}", nbr); } _mouseActions.Add(mouseAction); }
private void ProcessMouseStates() { //Refresh mouse states _prevMouseState = _curMouseState; _curMouseState = _mouseManager.Mouse.GetState(); //Check if an action needs to be triggered for (int i = 0; i < _mouseActions.Count; i++) { _mouseAction = _mouseActions[i]; //has this mouse action the need to be applied only in "Mouse Capture" mode ? if (_mouseAction.WithCursorLocked != null) { if (_mouseAction.WithCursorLocked != _mouseManager.MouseCapture) { continue; } } switch (_mouseAction.TriggerType) { case MouseTriggerMode.ButtonDown: switch (_mouseAction.Binding) { case MouseButton.LeftButton: if (_curMouseState.LeftButton == ButtonState.Pressed) { _bufferedActionsInProgress[_mouseAction.ActionId].Triggered = true; _bufferedActionsInProgress[_mouseAction.ActionId].RaisedSources |= ActionRaisedSources.Mouse; } break; case MouseButton.MiddleButton: if (_curMouseState.MiddleButton == ButtonState.Pressed) { _bufferedActionsInProgress[_mouseAction.ActionId].Triggered = true; _bufferedActionsInProgress[_mouseAction.ActionId].RaisedSources |= ActionRaisedSources.Mouse; } break; case MouseButton.RightButton: if (_curMouseState.RightButton == ButtonState.Pressed) { _bufferedActionsInProgress[_mouseAction.ActionId].Triggered = true; _bufferedActionsInProgress[_mouseAction.ActionId].RaisedSources |= ActionRaisedSources.Mouse; } break; case MouseButton.XButton1: if (_curMouseState.XButton1 == ButtonState.Pressed) { _bufferedActionsInProgress[_mouseAction.ActionId].Triggered = true; _bufferedActionsInProgress[_mouseAction.ActionId].RaisedSources |= ActionRaisedSources.Mouse; } break; case MouseButton.XButton2: if (_curMouseState.XButton2 == ButtonState.Pressed) { _bufferedActionsInProgress[_mouseAction.ActionId].Triggered = true; _bufferedActionsInProgress[_mouseAction.ActionId].RaisedSources |= ActionRaisedSources.Mouse; } break; case MouseButton.LeftAndRightButton: if (_curMouseState.LeftButton == ButtonState.Pressed && _curMouseState.RightButton == ButtonState.Pressed) { _bufferedActionsInProgress[_mouseAction.ActionId].Triggered = true; _bufferedActionsInProgress[_mouseAction.ActionId].RaisedSources |= ActionRaisedSources.Mouse; } break; } break; case MouseTriggerMode.ButtonReleased: //Set the Action Flag if required switch (_mouseAction.Binding) { case MouseButton.LeftButton: if (_curMouseState.LeftButton == ButtonState.Released && _prevMouseState.LeftButton == ButtonState.Pressed) { _bufferedActionsInProgress[_mouseAction.ActionId].Triggered = true; _bufferedActionsInProgress[_mouseAction.ActionId].RaisedSources |= ActionRaisedSources.Mouse; } break; case MouseButton.MiddleButton: if (_curMouseState.MiddleButton == ButtonState.Released && _prevMouseState.MiddleButton == ButtonState.Pressed) { _bufferedActionsInProgress[_mouseAction.ActionId].Triggered = true; _bufferedActionsInProgress[_mouseAction.ActionId].RaisedSources |= ActionRaisedSources.Mouse; } break; case MouseButton.RightButton: if (_curMouseState.RightButton == ButtonState.Released && _prevMouseState.RightButton == ButtonState.Pressed) { _bufferedActionsInProgress[_mouseAction.ActionId].Triggered = true; _bufferedActionsInProgress[_mouseAction.ActionId].RaisedSources |= ActionRaisedSources.Mouse; } break; case MouseButton.XButton1: if (_curMouseState.XButton1 == ButtonState.Released && _prevMouseState.XButton1 == ButtonState.Pressed) { _bufferedActionsInProgress[_mouseAction.ActionId].Triggered = true; _bufferedActionsInProgress[_mouseAction.ActionId].RaisedSources |= ActionRaisedSources.Mouse; } break; case MouseButton.XButton2: if (_curMouseState.XButton2 == ButtonState.Released && _prevMouseState.XButton2 == ButtonState.Pressed) { _bufferedActionsInProgress[_mouseAction.ActionId].Triggered = true; _bufferedActionsInProgress[_mouseAction.ActionId].RaisedSources |= ActionRaisedSources.Mouse; } break; case MouseButton.LeftAndRightButton: if (_curMouseState.LeftButton == ButtonState.Released && _prevMouseState.LeftButton == ButtonState.Pressed && _curMouseState.RightButton == ButtonState.Released && _prevMouseState.RightButton == ButtonState.Pressed) { _bufferedActionsInProgress[_mouseAction.ActionId].Triggered = true; _bufferedActionsInProgress[_mouseAction.ActionId].RaisedSources |= ActionRaisedSources.Mouse; } break; } break; case MouseTriggerMode.ButtonPressed: //Set the Action Flag if required switch (_mouseAction.Binding) { case MouseButton.LeftButton: if (_mouseAction.WithAutoResetButtonPressed && _mouseAction.StartTimeAutoResetTick == 0 && _curMouseState.LeftButton == ButtonState.Pressed) { //Mouse Button DOWN and autoresetting its ButtonPressed value - Memorize when the time when the mouse has been pressed _mouseAction.StartTimeAutoResetTick = Stopwatch.GetTimestamp(); } if (_mouseAction.WithAutoResetButtonPressed) { _actionTimeElapsedInS = (float)(((Stopwatch.GetTimestamp() - _mouseAction.StartTimeAutoResetTick) / (float)Stopwatch.Frequency)); } if ((_prevMouseState.LeftButton == ButtonState.Released && _curMouseState.LeftButton == ButtonState.Pressed) || (_mouseAction.WithAutoResetButtonPressed && _curMouseState.LeftButton == ButtonState.Pressed && _actionTimeElapsedInS >= _mouseAction.AutoResetTimeInS) ) { _bufferedActionsInProgress[_mouseAction.ActionId].Triggered = true; _bufferedActionsInProgress[_mouseAction.ActionId].RaisedSources |= ActionRaisedSources.Mouse; if (_prevMouseState.LeftButton == ButtonState.Pressed) { _bufferedActionsInProgress[_mouseAction.ActionId].IsAutoRepeatedEvent = true; } if (_mouseAction.WithAutoResetButtonPressed) { _mouseAction.StartTimeAutoResetTick = Stopwatch.GetTimestamp(); } } if (_mouseAction.WithAutoResetButtonPressed && _curMouseState.LeftButton != ButtonState.Pressed) { _mouseAction.StartTimeAutoResetTick = 0; } break; case MouseButton.MiddleButton: if (_mouseAction.WithAutoResetButtonPressed && _mouseAction.StartTimeAutoResetTick == 0 && _curMouseState.middleButton == ButtonState.Pressed) { //Mouse Button DOWN and autoresetting its ButtonPressed value - Memorize when the time when the mouse has been pressed _mouseAction.StartTimeAutoResetTick = Stopwatch.GetTimestamp(); } if (_mouseAction.WithAutoResetButtonPressed) { _actionTimeElapsedInS = (float)(((Stopwatch.GetTimestamp() - _mouseAction.StartTimeAutoResetTick) / (float)Stopwatch.Frequency)); } if ((_prevMouseState.middleButton == ButtonState.Released && _curMouseState.middleButton == ButtonState.Pressed) || (_mouseAction.WithAutoResetButtonPressed && _curMouseState.middleButton == ButtonState.Pressed && _actionTimeElapsedInS >= _mouseAction.AutoResetTimeInS) ) { _bufferedActionsInProgress[_mouseAction.ActionId].Triggered = true; _bufferedActionsInProgress[_mouseAction.ActionId].RaisedSources |= ActionRaisedSources.Mouse; if (_prevMouseState.middleButton == ButtonState.Pressed) { _bufferedActionsInProgress[_mouseAction.ActionId].IsAutoRepeatedEvent = true; } if (_mouseAction.WithAutoResetButtonPressed) { _mouseAction.StartTimeAutoResetTick = Stopwatch.GetTimestamp(); } } if (_mouseAction.WithAutoResetButtonPressed && _curMouseState.middleButton != ButtonState.Pressed) { _mouseAction.StartTimeAutoResetTick = 0; } break; case MouseButton.RightButton: if (_mouseAction.WithAutoResetButtonPressed && _mouseAction.StartTimeAutoResetTick == 0 && _curMouseState.rightButton == ButtonState.Pressed) { //Mouse Button DOWN and autoresetting its ButtonPressed value - Memorize when the time when the mouse has been pressed _mouseAction.StartTimeAutoResetTick = Stopwatch.GetTimestamp(); } if (_mouseAction.WithAutoResetButtonPressed) { _actionTimeElapsedInS = (float)(((Stopwatch.GetTimestamp() - _mouseAction.StartTimeAutoResetTick) / (float)Stopwatch.Frequency)); } if ((_prevMouseState.rightButton == ButtonState.Released && _curMouseState.rightButton == ButtonState.Pressed) || (_mouseAction.WithAutoResetButtonPressed && _curMouseState.rightButton == ButtonState.Pressed && _actionTimeElapsedInS >= _mouseAction.AutoResetTimeInS) ) { _bufferedActionsInProgress[_mouseAction.ActionId].Triggered = true; _bufferedActionsInProgress[_mouseAction.ActionId].RaisedSources |= ActionRaisedSources.Mouse; if (_prevMouseState.rightButton == ButtonState.Pressed) { _bufferedActionsInProgress[_mouseAction.ActionId].IsAutoRepeatedEvent = true; } if (_mouseAction.WithAutoResetButtonPressed) { _mouseAction.StartTimeAutoResetTick = Stopwatch.GetTimestamp(); } } if (_mouseAction.WithAutoResetButtonPressed && _curMouseState.rightButton != ButtonState.Pressed) { _mouseAction.StartTimeAutoResetTick = 0; } break; case MouseButton.XButton1: if (_mouseAction.WithAutoResetButtonPressed && _mouseAction.StartTimeAutoResetTick == 0 && _curMouseState.XButton1 == ButtonState.Pressed) { //Mouse Button DOWN and autoresetting its ButtonPressed value - Memorize when the time when the mouse has been pressed _mouseAction.StartTimeAutoResetTick = Stopwatch.GetTimestamp(); } if (_mouseAction.WithAutoResetButtonPressed) { _actionTimeElapsedInS = (float)(((Stopwatch.GetTimestamp() - _mouseAction.StartTimeAutoResetTick) / (float)Stopwatch.Frequency)); } if ((_prevMouseState.XButton1 == ButtonState.Released && _curMouseState.XButton1 == ButtonState.Pressed) || (_mouseAction.WithAutoResetButtonPressed && _curMouseState.XButton1 == ButtonState.Pressed && _actionTimeElapsedInS >= _mouseAction.AutoResetTimeInS) ) { _bufferedActionsInProgress[_mouseAction.ActionId].Triggered = true; _bufferedActionsInProgress[_mouseAction.ActionId].RaisedSources |= ActionRaisedSources.Mouse; if (_prevMouseState.XButton1 == ButtonState.Pressed) { _bufferedActionsInProgress[_mouseAction.ActionId].IsAutoRepeatedEvent = true; } if (_mouseAction.WithAutoResetButtonPressed) { _mouseAction.StartTimeAutoResetTick = Stopwatch.GetTimestamp(); } } if (_mouseAction.WithAutoResetButtonPressed && _curMouseState.XButton1 != ButtonState.Pressed) { _mouseAction.StartTimeAutoResetTick = 0; } break; case MouseButton.XButton2: if (_mouseAction.WithAutoResetButtonPressed && _mouseAction.StartTimeAutoResetTick == 0 && _curMouseState.XButton2 == ButtonState.Pressed) { //Mouse Button DOWN and autoresetting its ButtonPressed value - Memorize when the time when the mouse has been pressed _mouseAction.StartTimeAutoResetTick = Stopwatch.GetTimestamp(); } if (_mouseAction.WithAutoResetButtonPressed) { _actionTimeElapsedInS = (float)(((Stopwatch.GetTimestamp() - _mouseAction.StartTimeAutoResetTick) / (float)Stopwatch.Frequency)); } if ((_prevMouseState.XButton2 == ButtonState.Released && _curMouseState.XButton2 == ButtonState.Pressed) || (_mouseAction.WithAutoResetButtonPressed && _curMouseState.XButton2 == ButtonState.Pressed && _actionTimeElapsedInS >= _mouseAction.AutoResetTimeInS) ) { _bufferedActionsInProgress[_mouseAction.ActionId].Triggered = true; _bufferedActionsInProgress[_mouseAction.ActionId].RaisedSources |= ActionRaisedSources.Mouse; if (_prevMouseState.XButton2 == ButtonState.Pressed) { _bufferedActionsInProgress[_mouseAction.ActionId].IsAutoRepeatedEvent = true; } if (_mouseAction.WithAutoResetButtonPressed) { _mouseAction.StartTimeAutoResetTick = Stopwatch.GetTimestamp(); } } if (_mouseAction.WithAutoResetButtonPressed && _curMouseState.XButton2 != ButtonState.Pressed) { _mouseAction.StartTimeAutoResetTick = 0; } break; case MouseButton.LeftAndRightButton: if (_mouseAction.WithAutoResetButtonPressed && _mouseAction.StartTimeAutoResetTick == 0 && _curMouseState.LeftButton == ButtonState.Pressed && _curMouseState.rightButton == ButtonState.Pressed) { //Mouse Button DOWN and autoresetting its ButtonPressed value - Memorize when the time when the mouse has been pressed _mouseAction.StartTimeAutoResetTick = Stopwatch.GetTimestamp(); } if (_mouseAction.WithAutoResetButtonPressed) { _actionTimeElapsedInS = (float)(((Stopwatch.GetTimestamp() - _mouseAction.StartTimeAutoResetTick) / (float)Stopwatch.Frequency)); } if ((_prevMouseState.leftButton == ButtonState.Released && _curMouseState.leftButton == ButtonState.Pressed && _prevMouseState.rightButton == ButtonState.Released && _curMouseState.rightButton == ButtonState.Pressed) || (_mouseAction.WithAutoResetButtonPressed && _curMouseState.rightButton == ButtonState.Pressed && _curMouseState.leftButton == ButtonState.Pressed && _actionTimeElapsedInS >= _mouseAction.AutoResetTimeInS) ) { _bufferedActionsInProgress[_mouseAction.ActionId].Triggered = true; _bufferedActionsInProgress[_mouseAction.ActionId].RaisedSources |= ActionRaisedSources.Mouse; if (_prevMouseState.leftButton == ButtonState.Pressed && _prevMouseState.rightButton == ButtonState.Pressed) { _bufferedActionsInProgress[_mouseAction.ActionId].IsAutoRepeatedEvent = true; } if (_mouseAction.WithAutoResetButtonPressed) { _mouseAction.StartTimeAutoResetTick = Stopwatch.GetTimestamp(); } } if (_mouseAction.WithAutoResetButtonPressed && _curMouseState.leftButton != ButtonState.Pressed && _curMouseState.rightButton != ButtonState.Pressed) { _mouseAction.StartTimeAutoResetTick = 0; } break; } break; case MouseTriggerMode.ScrollWheelForward: if (_curMouseState.ScrollWheelTicks > _prevMouseState.ScrollWheelTicks) { _bufferedActionsInProgress[_mouseAction.ActionId].Triggered = true; _bufferedActionsInProgress[_mouseAction.ActionId].RaisedSources |= ActionRaisedSources.Mouse; } break; case MouseTriggerMode.ScrollWheelBackWard: if (_curMouseState.ScrollWheelTicks < _prevMouseState.ScrollWheelTicks) { _bufferedActionsInProgress[_mouseAction.ActionId].Triggered = true; _bufferedActionsInProgress[_mouseAction.ActionId].RaisedSources |= ActionRaisedSources.Mouse; } break; } } }