/// <summary> /// Handle mouse click on the game screen /// </summary> private void handleMouse() { MouseState mouseState = Mouse.GetState(); XnaUIComponent target = ((XnaUITestGame)Game).MouseInputEngine.GetTarget(new Point(mouseState.X, mouseState.Y)); bool within = false; while (target != null) { if (target == this) { within = true; break; } target = target.Parent; } if (within) { Point mousePoint = new Point(ScrollX + mouseState.X, ScrollY + mouseState.Y); leftButtonStrategy.HandleMouseInput(mouseState.LeftButton == ButtonState.Pressed, mouseState.RightButton == ButtonState.Pressed, mousePoint); } else { leftButtonStrategy.CancelProgress(); } }
public XnaUIComponent GetTarget(Point p) { XnaUIComponent current = frame; bool searching = true; while (searching) { p.X += current.ScrollX; p.Y += current.ScrollY; searching = false; for (int i = current.GetChildren().Count - 1; i >= 0; i--) { XnaUIComponent component = current.GetChildren()[i]; if (component.Visible) { Rectangle box = new Rectangle(component.DrawBox.X, component.DrawBox.Y, component.DrawBox.Width, component.DrawBox.Height); if (contains(p, box)) { current = component; p.X -= component.DrawBox.X; p.Y -= component.DrawBox.Y; searching = true; break; } } } } return(current); }
private XnaUIComponent getCommonAncestor(XnaUIComponent c1, XnaUIComponent c2) { List <XnaUIComponent> list1 = new List <XnaUIComponent>(); XnaUIComponent current = c1; while (current != null) { list1.Add(current); current = current.Parent; } List <XnaUIComponent> list2 = new List <XnaUIComponent>(); current = c2; while (current != null) { list2.Add(current); current = current.Parent; } int differenceInSize = Math.Abs(list1.Count - list2.Count); List <XnaUIComponent> longerList = list2.Count > list1.Count ? list2 : list1; while (differenceInSize > 0) { longerList.RemoveAt(0); differenceInSize--; } XnaUIComponent commonAncestor = null; for (int i = 0; i < list1.Count; i++) { if (list1[i] == list2[i]) { commonAncestor = list1[i]; break; } } return(commonAncestor); }
public override void Update(GameTime gameTime) { MouseState mouseState = Mouse.GetState(); Point mousePoint = new Point(mouseState.X, mouseState.Y); XnaUIComponent currentUIOn = GetTarget(mousePoint); // Fire all events for mouse down, mouse up, and clicks if (mouseState.LeftButton == ButtonState.Pressed) { if (leftMouseDownTarget == null) { leftMouseDownTarget = GetTarget(mousePoint); XnaMouseEventArgs e = new XnaMouseEventArgs(); e.Target = leftMouseDownTarget; e.ClickLocation = mousePoint; e.Handled = false; e.Bubbled = false; e.ButtonPressed = MouseButton.Left; e.SingleTarget = true; e.time = System.Environment.TickCount; frame.MouseDown(e); } } else { if (leftMouseDownTarget != null) { XnaUIComponent leftMouseUpTarget = currentUIOn; XnaUIComponent commonAncestor = getCommonAncestor(leftMouseDownTarget, leftMouseUpTarget); if (commonAncestor != null) { XnaMouseEventArgs mouseUpEventArgs = new XnaMouseEventArgs(); mouseUpEventArgs.Target = commonAncestor; mouseUpEventArgs.ClickLocation = mousePoint; mouseUpEventArgs.Handled = false; mouseUpEventArgs.Bubbled = false; mouseUpEventArgs.ButtonPressed = MouseButton.Left; mouseUpEventArgs.SingleTarget = (leftMouseDownTarget == leftMouseUpTarget); mouseUpEventArgs.time = System.Environment.TickCount; frame.MouseUp(mouseUpEventArgs); XnaMouseEventArgs e = new XnaMouseEventArgs(); e.Target = commonAncestor; e.ClickLocation = mousePoint; e.Handled = false; e.Bubbled = false; e.ButtonPressed = MouseButton.Left; e.SingleTarget = (leftMouseDownTarget == leftMouseUpTarget); e.time = System.Environment.TickCount; frame.Click(e); } // Reset the state. leftMouseDownTarget = null; } } if (mouseState.RightButton == ButtonState.Pressed) { if (rightMouseDownTarget == null) { rightMouseDownTarget = currentUIOn; XnaMouseEventArgs e = new XnaMouseEventArgs(); e.Target = rightMouseDownTarget; e.ClickLocation = mousePoint; e.Handled = false; e.Bubbled = false; e.ButtonPressed = MouseButton.Right; e.SingleTarget = true; e.time = System.Environment.TickCount; frame.MouseDown(e); } } else { if (rightMouseDownTarget != null) { XnaUIComponent rightMouseUpTarget = GetTarget(mousePoint); XnaUIComponent commonAncestor = getCommonAncestor(rightMouseDownTarget, rightMouseUpTarget); if (commonAncestor != null) { XnaMouseEventArgs mouseUpEventArgs = new XnaMouseEventArgs(); mouseUpEventArgs.Target = commonAncestor; mouseUpEventArgs.ClickLocation = mousePoint; mouseUpEventArgs.Handled = false; mouseUpEventArgs.Bubbled = false; mouseUpEventArgs.ButtonPressed = MouseButton.Left; mouseUpEventArgs.SingleTarget = (rightMouseDownTarget == rightMouseUpTarget); mouseUpEventArgs.time = System.Environment.TickCount; frame.MouseUp(mouseUpEventArgs); XnaMouseEventArgs e = new XnaMouseEventArgs(); e.Target = commonAncestor; e.ClickLocation = mousePoint; e.Handled = false; e.Bubbled = false; e.ButtonPressed = MouseButton.Right; e.SingleTarget = (rightMouseDownTarget == rightMouseUpTarget); e.time = System.Environment.TickCount; frame.Click(e); } // Reset the state. rightMouseDownTarget = null; } } // Handle mouse enter and exit events. if (mouseHoverTarget != currentUIOn) { // Base case : First time entering. if (mouseHoverTarget == null) { XnaUIComponent current = currentUIOn; Stack <XnaUIComponent> stack = new Stack <XnaUIComponent>(); while (current != null) { stack.Push(current); current = current.Parent; } while (stack.Count > 0) { current = stack.Pop(); current.MouseEnter(); } } else { // Mouse has moved XnaUIComponent current = mouseHoverTarget; XnaUIComponent ancestor = getCommonAncestor(currentUIOn, mouseHoverTarget); while (current != ancestor) { current.MouseLeave(); current = current.Parent; } current = currentUIOn; Stack <XnaUIComponent> stack = new Stack <XnaUIComponent>(); while (current != ancestor) { stack.Push(current); current = current.Parent; } while (stack.Count > 0) { current = stack.Pop(); current.MouseEnter(); } } mouseHoverTarget = currentUIOn; } base.Update(gameTime); }