/// <summary> /// Responds to user input, changing the selected entry and accepting /// or cancelling the menu. /// </summary> public override void HandleInput(InputState input) { int dirX = 0, dirY = 0; //figure out the directions to move if (input.IsMenuUp(ControllingPlayer)) dirX = -1; if (input.IsMenuDown(ControllingPlayer)) dirX = 1; if (input.IsMenuLeft(ControllingPlayer)) dirY = -1; if (input.IsMenuRight(ControllingPlayer)) dirY = 1; //if horizontal orientation, swap directions if (!IsVertical) { int temp = dirX; dirX = dirY; dirY = temp; } //process row movement if (dirX != 0) { if (selectedEntry.Column < 0 || selectedEntry.Column >= menuColumns.Length) selectedEntry.Column = 0; int length = menuColumns[selectedEntry.Column].Count; do { selectedEntry.Row += dirX; if (selectedEntry.Row < 0) selectedEntry.Row = length - 1; selectedEntry.Row %= length; } while (!Selected.Enabled); } //handle column selection (left/right) //ultimately, index selection will also be in here // if the index can go up/down, let it. otherwise, change columns. easy. if (dirY != 0) { if (selectedEntry.Row < 0 || selectedEntry.Row >= menuColumns[selectedEntry.Column].Count) selectedEntry.Row = 0; if (relativeSelection) ChangeColumnsRelative(dirY); else ChangeColumns(dirY); } // Accept or cancel the menu? We pass in our ControllingPlayer, which may // either be null (to accept input from any player) or a specific index. // If we pass a null controlling player, the InputState helper returns to // us which player actually provided the input. We pass that through to // OnSelectEntry and OnCancel, so they can tell which player triggered them. PlayerIndex playerIndex; if (input.IsMenuSelect(ControllingPlayer, out playerIndex)) { OnSelectEntry(selectedEntry, playerIndex); } else if (input.IsMenuCancel(ControllingPlayer, out playerIndex)) { OnCancel(playerIndex); } #region Mouse Handling #if WINDOWS bool clicked = input.IsNewMouseButtonPress(MouseButtons.Left); if (input.IsMouseMoved() || clicked) { mousePosition.X = input.CurrentMouseState.X; mousePosition.Y = input.CurrentMouseState.Y; //check mouse pos against each menu entry and update selection if necessary if (AllowEmptySelection) selectedEntry.Column = selectedEntry.Row = selectedEntry.Index = -5; for (int col = 0; col < menuColumns.Length; col++) { for (int i = 0; i < menuColumns[col].Count; i++) { MenuEntry menuEntry = menuColumns[col][i]; if (menuEntry.Contains(mousePosition) && menuEntry.Enabled) { selectedEntry.Column = col; selectedEntry.Row = i; if (clicked) OnSelectEntry(selectedEntry, PlayerIndex.One); } } } } #endif HandleSpecialInput(input, Selected); #endregion }