Move Game.Controller.HandleInput into a widget; works but is hacky
This commit is contained in:
@@ -17,7 +17,7 @@ using OpenRA.Traits;
|
|||||||
|
|
||||||
namespace OpenRA
|
namespace OpenRA
|
||||||
{
|
{
|
||||||
public class Controller : IHandleInput
|
public class Controller
|
||||||
{
|
{
|
||||||
public IOrderGenerator orderGenerator = new UnitOrderGenerator();
|
public IOrderGenerator orderGenerator = new UnitOrderGenerator();
|
||||||
public Selection selection = new Selection();
|
public Selection selection = new Selection();
|
||||||
@@ -38,7 +38,7 @@ namespace OpenRA
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApplyOrders(World world, float2 xy, MouseInput mi)
|
public void ApplyOrders(World world, float2 xy, MouseInput mi)
|
||||||
{
|
{
|
||||||
if (orderGenerator == null) return;
|
if (orderGenerator == null) return;
|
||||||
|
|
||||||
@@ -61,40 +61,7 @@ namespace OpenRA
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
float2 dragStart, dragEnd;
|
public float2 dragStart, dragEnd;
|
||||||
public bool HandleInput(World world, MouseInput mi)
|
|
||||||
{
|
|
||||||
var xy = Game.viewport.ViewToWorld(mi);
|
|
||||||
|
|
||||||
if (mi.Button == MouseButton.Left && mi.Event == MouseInputEvent.Down)
|
|
||||||
{
|
|
||||||
dragStart = dragEnd = xy;
|
|
||||||
ApplyOrders(world, xy, mi);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mi.Button == MouseButton.Left && mi.Event == MouseInputEvent.Move)
|
|
||||||
dragEnd = xy;
|
|
||||||
|
|
||||||
if (mi.Button == MouseButton.Left && mi.Event == MouseInputEvent.Up)
|
|
||||||
{
|
|
||||||
if (orderGenerator is UnitOrderGenerator)
|
|
||||||
{
|
|
||||||
var newSelection = world.SelectActorsInBox(Game.CellSize * dragStart, Game.CellSize * xy);
|
|
||||||
selection.Combine(world, newSelection, mi.Modifiers.HasModifier(Modifiers.Shift), dragStart == xy);
|
|
||||||
}
|
|
||||||
|
|
||||||
dragStart = dragEnd = xy;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mi.Button == MouseButton.None && mi.Event == MouseInputEvent.Move)
|
|
||||||
dragStart = dragEnd = xy;
|
|
||||||
|
|
||||||
if (mi.Button == MouseButton.Right && mi.Event == MouseInputEvent.Down)
|
|
||||||
ApplyOrders(world, xy, mi);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Pair<float2, float2>? SelectionBox
|
public Pair<float2, float2>? SelectionBox
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@@ -107,31 +74,6 @@ namespace OpenRA
|
|||||||
public float2 MousePosition { get { return dragEnd; } }
|
public float2 MousePosition { get { return dragEnd; } }
|
||||||
Modifiers modifiers;
|
Modifiers modifiers;
|
||||||
|
|
||||||
public string ChooseCursor( World world )
|
|
||||||
{
|
|
||||||
int sync = world.SyncHash();
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (!world.GameHasStarted)
|
|
||||||
return "default";
|
|
||||||
|
|
||||||
var mi = new MouseInput
|
|
||||||
{
|
|
||||||
Location = ( Game.CellSize * MousePosition - Game.viewport.Location ).ToInt2(),
|
|
||||||
Button = MouseButton.Right,
|
|
||||||
Modifiers = modifiers
|
|
||||||
};
|
|
||||||
|
|
||||||
return orderGenerator.GetCursor( world, MousePosition.ToInt2(), mi );
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
if( sync != world.SyncHash() )
|
|
||||||
throw new InvalidOperationException( "Desync in Controller.ChooseCursor" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetModifiers(Modifiers mods) { modifiers = mods; }
|
public void SetModifiers(Modifiers mods) { modifiers = mods; }
|
||||||
public Modifiers GetModifiers() { return modifiers; }
|
public Modifiers GetModifiers() { return modifiers; }
|
||||||
|
|
||||||
|
|||||||
@@ -17,11 +17,6 @@ using OpenRA.Widgets;
|
|||||||
|
|
||||||
namespace OpenRA.Graphics
|
namespace OpenRA.Graphics
|
||||||
{
|
{
|
||||||
interface IHandleInput
|
|
||||||
{
|
|
||||||
bool HandleInput(World world, MouseInput mi);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Viewport
|
class Viewport
|
||||||
{
|
{
|
||||||
readonly float2 screenSize;
|
readonly float2 screenSize;
|
||||||
@@ -41,8 +36,6 @@ namespace OpenRA.Graphics
|
|||||||
scrollPosition = scrollPosition + delta;
|
scrollPosition = scrollPosition + delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IHandleInput> regions { get { return new IHandleInput[] { Widget.RootWidget, Game.controller }; } }
|
|
||||||
|
|
||||||
public Viewport(float2 screenSize, int2 mapStart, int2 mapEnd, Renderer renderer)
|
public Viewport(float2 screenSize, int2 mapStart, int2 mapEnd, Renderer renderer)
|
||||||
{
|
{
|
||||||
this.screenSize = screenSize;
|
this.screenSize = screenSize;
|
||||||
@@ -68,7 +61,7 @@ namespace OpenRA.Graphics
|
|||||||
Widget.DoDraw(world);
|
Widget.DoDraw(world);
|
||||||
Timer.Time( "widgets: {0}" );
|
Timer.Time( "widgets: {0}" );
|
||||||
|
|
||||||
var cursorName = Widget.RootWidget.GetCursorOuter(mousePos) ?? Game.controller.ChooseCursor( world );
|
var cursorName = Widget.RootWidget.GetCursorOuter(mousePos) ?? "default";
|
||||||
var c = new Cursor(cursorName);
|
var c = new Cursor(cursorName);
|
||||||
c.Draw((int)cursorFrame, mousePos + Location);
|
c.Draw((int)cursorFrame, mousePos + Location);
|
||||||
Timer.Time( "cursors: {0}" );
|
Timer.Time( "cursors: {0}" );
|
||||||
@@ -86,21 +79,12 @@ namespace OpenRA.Graphics
|
|||||||
cursorFrame += 0.5f;
|
cursorFrame += 0.5f;
|
||||||
}
|
}
|
||||||
|
|
||||||
IHandleInput dragRegion = null;
|
|
||||||
public void DispatchMouseInput(World world, MouseInput mi)
|
public void DispatchMouseInput(World world, MouseInput mi)
|
||||||
{
|
{
|
||||||
if (mi.Event == MouseInputEvent.Move)
|
if (mi.Event == MouseInputEvent.Move)
|
||||||
mousePos = mi.Location;
|
mousePos = mi.Location;
|
||||||
|
|
||||||
if (dragRegion != null) {
|
Widget.HandleInput(world, mi);
|
||||||
dragRegion.HandleInput( world, mi );
|
|
||||||
if (mi.Event == MouseInputEvent.Up) dragRegion = null;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
dragRegion = regions.FirstOrDefault(r => r.HandleInput(world, mi));
|
|
||||||
if (mi.Event != MouseInputEvent.Down)
|
|
||||||
dragRegion = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public float2 ViewToWorld(MouseInput mi)
|
public float2 ViewToWorld(MouseInput mi)
|
||||||
|
|||||||
@@ -228,6 +228,7 @@
|
|||||||
<Compile Include="Widgets\TimerWidget.cs" />
|
<Compile Include="Widgets\TimerWidget.cs" />
|
||||||
<Compile Include="Widgets\ShpImageWidget.cs" />
|
<Compile Include="Widgets\ShpImageWidget.cs" />
|
||||||
<Compile Include="Widgets\OrderButtonWidget.cs" />
|
<Compile Include="Widgets\OrderButtonWidget.cs" />
|
||||||
|
<Compile Include="Widgets\DefaultInputControllerWidget.cs" />
|
||||||
<Compile Include="Traits\DrawLineToTarget.cs" />
|
<Compile Include="Traits\DrawLineToTarget.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
87
OpenRA.Game/Widgets/DefaultInputControllerWidget.cs
Normal file
87
OpenRA.Game/Widgets/DefaultInputControllerWidget.cs
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
#region Copyright & License Information
|
||||||
|
/*
|
||||||
|
* Copyright 2007-2010 The OpenRA Developers (see AUTHORS)
|
||||||
|
* This file is part of OpenRA, which is free software. It is made
|
||||||
|
* available to you under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation. For more information,
|
||||||
|
* see LICENSE.
|
||||||
|
*/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using OpenRA.Orders;
|
||||||
|
|
||||||
|
namespace OpenRA.Widgets
|
||||||
|
{
|
||||||
|
class DefaultInputControllerWidget : Widget
|
||||||
|
{
|
||||||
|
public DefaultInputControllerWidget() : base() {}
|
||||||
|
protected DefaultInputControllerWidget(DefaultInputControllerWidget widget) : base(widget) {}
|
||||||
|
public override void DrawInner( World world ) { }
|
||||||
|
|
||||||
|
// TODO: need a mechanism to say "i'll only handle this info if NOTHING else has"
|
||||||
|
// For now, ensure that this widget recieves the input last or it will eat it
|
||||||
|
float2 dragStart, dragEnd;
|
||||||
|
public override bool HandleInputInner(MouseInput mi)
|
||||||
|
{
|
||||||
|
var xy = Game.viewport.ViewToWorld(mi);
|
||||||
|
var world = Game.world;
|
||||||
|
if (mi.Button == MouseButton.Left && mi.Event == MouseInputEvent.Down)
|
||||||
|
{
|
||||||
|
dragStart = dragEnd = xy;
|
||||||
|
Game.controller.ApplyOrders(world, xy, mi);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mi.Button == MouseButton.Left && mi.Event == MouseInputEvent.Move)
|
||||||
|
dragEnd = xy;
|
||||||
|
|
||||||
|
if (mi.Button == MouseButton.Left && mi.Event == MouseInputEvent.Up)
|
||||||
|
{
|
||||||
|
if (Game.controller.orderGenerator is UnitOrderGenerator)
|
||||||
|
{
|
||||||
|
var newSelection = Game.world.SelectActorsInBox(Game.CellSize * dragStart, Game.CellSize * xy);
|
||||||
|
Game.controller.selection.Combine(world, newSelection, mi.Modifiers.HasModifier(Modifiers.Shift), dragStart == xy);
|
||||||
|
}
|
||||||
|
|
||||||
|
dragStart = dragEnd = xy;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mi.Button == MouseButton.None && mi.Event == MouseInputEvent.Move)
|
||||||
|
dragStart = dragEnd = xy;
|
||||||
|
|
||||||
|
if (mi.Button == MouseButton.Right && mi.Event == MouseInputEvent.Down)
|
||||||
|
Game.controller.ApplyOrders(world, xy, mi);
|
||||||
|
|
||||||
|
Game.controller.dragStart = dragStart;
|
||||||
|
Game.controller.dragEnd = dragEnd;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string GetCursor(int2 pos)
|
||||||
|
{
|
||||||
|
var world = Game.world;
|
||||||
|
int sync = world.SyncHash();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!world.GameHasStarted)
|
||||||
|
return "default";
|
||||||
|
|
||||||
|
var mi = new MouseInput
|
||||||
|
{
|
||||||
|
Location = pos,
|
||||||
|
Button = MouseButton.Right,
|
||||||
|
Modifiers = Game.controller.GetModifiers()
|
||||||
|
};
|
||||||
|
|
||||||
|
return Game.controller.orderGenerator.GetCursor( world, Game.viewport.ViewToWorld(mi).ToInt2(), mi );
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if( sync != world.SyncHash() )
|
||||||
|
throw new InvalidOperationException( "Desync in InputControllerWidget.GetCursor" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Widget Clone() { return new DefaultInputControllerWidget(this); }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -104,10 +104,10 @@ namespace OpenRA.Widgets
|
|||||||
Location = (loc * Game.CellSize - Game.viewport.Location).ToInt2()
|
Location = (loc * Game.CellSize - Game.viewport.Location).ToInt2()
|
||||||
};
|
};
|
||||||
|
|
||||||
Game.controller.HandleInput(Game.world, fakemi);
|
Widget.HandleInput(Game.world, fakemi);
|
||||||
|
|
||||||
fakemi.Event = MouseInputEvent.Up;
|
fakemi.Event = MouseInputEvent.Up;
|
||||||
Game.controller.HandleInput(Game.world, fakemi);
|
Widget.HandleInput(Game.world, fakemi);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ using OpenRA.Graphics;
|
|||||||
|
|
||||||
namespace OpenRA.Widgets
|
namespace OpenRA.Widgets
|
||||||
{
|
{
|
||||||
public abstract class Widget : IHandleInput
|
public abstract class Widget
|
||||||
{
|
{
|
||||||
// Info defined in YAML
|
// Info defined in YAML
|
||||||
public string Id = null;
|
public string Id = null;
|
||||||
@@ -205,7 +205,7 @@ namespace OpenRA.Widgets
|
|||||||
|
|
||||||
public static int TicksSinceLastMove = 0;
|
public static int TicksSinceLastMove = 0;
|
||||||
public static int2 LastMousePos;
|
public static int2 LastMousePos;
|
||||||
public bool HandleInput(World world, MouseInput mi)
|
public static bool HandleInput(World world, MouseInput mi)
|
||||||
{
|
{
|
||||||
if (SelectedWidget != null && SelectedWidget.HandleMouseInputOuter(mi))
|
if (SelectedWidget != null && SelectedWidget.HandleMouseInputOuter(mi))
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -5,6 +5,11 @@ Container@ROOT:
|
|||||||
Delegate:IngameChromeDelegate
|
Delegate:IngameChromeDelegate
|
||||||
Visible:false
|
Visible:false
|
||||||
Children:
|
Children:
|
||||||
|
DefaultInputController:
|
||||||
|
X:0
|
||||||
|
Y:0
|
||||||
|
Width:WINDOW_RIGHT
|
||||||
|
Height:WINDOW_BOTTOM
|
||||||
Timer@GAME_TIMER:
|
Timer@GAME_TIMER:
|
||||||
Id:GAME_TIMER
|
Id:GAME_TIMER
|
||||||
X: WINDOW_RIGHT/2
|
X: WINDOW_RIGHT/2
|
||||||
|
|||||||
@@ -40,11 +40,11 @@ Assemblies:
|
|||||||
mods/cnc/OpenRA.Mods.Cnc.dll: Cnc mod traits
|
mods/cnc/OpenRA.Mods.Cnc.dll: Cnc mod traits
|
||||||
|
|
||||||
ChromeLayout:
|
ChromeLayout:
|
||||||
|
mods/cnc/chrome/ingame.yaml:
|
||||||
mods/cnc/chrome/mainmenu.yaml:
|
mods/cnc/chrome/mainmenu.yaml:
|
||||||
mods/cnc/chrome/settings.yaml:
|
mods/cnc/chrome/settings.yaml:
|
||||||
mods/cnc/chrome/gamelobby.yaml:
|
mods/cnc/chrome/gamelobby.yaml:
|
||||||
mods/cnc/chrome/serverbrowser.yaml:
|
mods/cnc/chrome/serverbrowser.yaml:
|
||||||
mods/cnc/chrome/ingame.yaml:
|
|
||||||
|
|
||||||
Weapons:
|
Weapons:
|
||||||
mods/cnc/weapons.yaml:
|
mods/cnc/weapons.yaml:
|
||||||
|
|||||||
@@ -5,6 +5,11 @@ Container@ROOT:
|
|||||||
Delegate:IngameChromeDelegate
|
Delegate:IngameChromeDelegate
|
||||||
Visible:false
|
Visible:false
|
||||||
Children:
|
Children:
|
||||||
|
DefaultInputController:
|
||||||
|
X:0
|
||||||
|
Y:0
|
||||||
|
Width:WINDOW_RIGHT
|
||||||
|
Height:WINDOW_BOTTOM
|
||||||
Timer@GAME_TIMER:
|
Timer@GAME_TIMER:
|
||||||
Id:GAME_TIMER
|
Id:GAME_TIMER
|
||||||
X: WINDOW_RIGHT/2
|
X: WINDOW_RIGHT/2
|
||||||
|
|||||||
@@ -39,11 +39,11 @@ Assemblies:
|
|||||||
mods/ra/OpenRA.Mods.RA.dll: Traits used
|
mods/ra/OpenRA.Mods.RA.dll: Traits used
|
||||||
|
|
||||||
ChromeLayout:
|
ChromeLayout:
|
||||||
|
mods/ra/chrome/ingame.yaml:
|
||||||
mods/ra/chrome/mainmenu.yaml:
|
mods/ra/chrome/mainmenu.yaml:
|
||||||
mods/ra/chrome/settings.yaml:
|
mods/ra/chrome/settings.yaml:
|
||||||
mods/ra/chrome/gamelobby.yaml:
|
mods/ra/chrome/gamelobby.yaml:
|
||||||
mods/ra/chrome/serverbrowser.yaml:
|
mods/ra/chrome/serverbrowser.yaml:
|
||||||
mods/ra/chrome/ingame.yaml:
|
|
||||||
|
|
||||||
Weapons:
|
Weapons:
|
||||||
mods/ra/weapons.yaml
|
mods/ra/weapons.yaml
|
||||||
|
|||||||
Reference in New Issue
Block a user