Proper mouseover support.

This commit is contained in:
Paul Chote
2011-07-04 04:58:56 +12:00
parent 1114293035
commit e9d67860de
10 changed files with 47 additions and 21 deletions

View File

@@ -28,6 +28,7 @@ namespace OpenRA.Widgets
static Widget rootWidget = new ContainerWidget();
static Stack<Widget> WindowList = new Stack<Widget>();
public static Widget SelectedWidget;
public static Widget MouseOverWidget;
public static void CloseWindow()
{
@@ -68,7 +69,10 @@ namespace OpenRA.Widgets
public static bool DoHandleInput(MouseInput mi)
{
bool handled = false;
if (mi.Event == MouseInputEvent.Move)
MouseOverWidget = null;
bool handled = false;
if (SelectedWidget != null && SelectedWidget.HandleMouseInputOuter(mi))
handled = true;
@@ -80,6 +84,7 @@ namespace OpenRA.Widgets
Viewport.LastMousePos = mi.Location;
Viewport.TicksSinceLastMove = 0;
}
return handled;
}
@@ -110,6 +115,7 @@ namespace OpenRA.Widgets
public string Logic = null;
public object LogicObject { get; private set; }
public bool Visible = true;
public bool IgnoreChildMouseOver;
// Calculated internally
public Rectangle Bounds;
@@ -132,6 +138,7 @@ namespace OpenRA.Widgets
Parent = widget.Parent;
IsVisible = widget.IsVisible;
IgnoreChildMouseOver = widget.IgnoreChildMouseOver;
foreach (var child in widget.Children)
AddChild(child.Clone());
@@ -215,6 +222,7 @@ namespace OpenRA.Widgets
if (SelectedWidget != null && !SelectedWidget.LoseFocus(mi))
return false;
SelectedWidget = this;
return true;
}
@@ -255,15 +263,22 @@ namespace OpenRA.Widgets
public virtual bool HandleMouseInput(MouseInput mi) { return false; }
public bool HandleMouseInputOuter(MouseInput mi)
{
// Are we able to handle this event?
// Are we able to handle this event?
if (!(Focused || (IsVisible() && GetEventBounds().Contains(mi.Location.X, mi.Location.Y))))
return false;
var oldMouseOver = MouseOverWidget;
// Send the event to the deepest children first and bubble up if unhandled
foreach (var child in Children.OfType<Widget>().Reverse())
if (child.HandleMouseInputOuter(mi))
return true;
if (IgnoreChildMouseOver)
MouseOverWidget = oldMouseOver;
if (mi.Event == MouseInputEvent.Move && MouseOverWidget == null)
MouseOverWidget = this;
return HandleMouseInput(mi);
}