Merge pull request #2719 from Mailaender/hotkeys

Additional Hotkeys
This commit is contained in:
Chris Forbes
2013-03-02 13:35:38 -08:00
7 changed files with 61 additions and 20 deletions

View File

@@ -125,7 +125,8 @@ namespace OpenRA.GameRules
public string PauseKey = "f3"; public string PauseKey = "f3";
public string CycleBaseKey = "backspace"; public string CycleBaseKey = "backspace";
public string GotoLastEventKey = "space"; public string ToLastEventKey = "space";
public string ToSelectionKey = "home";
public string SellKey = "v"; public string SellKey = "v";
public string PowerDownKey = "b"; public string PowerDownKey = "b";
public string RepairKey = "n"; public string RepairKey = "n";

View File

@@ -1,6 +1,6 @@
#region Copyright & License Information #region Copyright & License Information
/* /*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS) * Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made * 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 * available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information, * as published by the Free Software Foundation. For more information,
@@ -64,7 +64,7 @@ namespace OpenRA
Cache<int, List<Actor>> controlGroups = new Cache<int, List<Actor>>(_ => new List<Actor>()); Cache<int, List<Actor>> controlGroups = new Cache<int, List<Actor>>(_ => new List<Actor>());
public void DoControlGroup(World world, int group, Modifiers mods) public void DoControlGroup(World world, int group, Modifiers mods, int MultiTapCount)
{ {
var addModifier = Platform.CurrentPlatform == PlatformType.OSX ? Modifiers.Meta : Modifiers.Ctrl; var addModifier = Platform.CurrentPlatform == PlatformType.OSX ? Modifiers.Meta : Modifiers.Ctrl;
if (mods.HasModifier(addModifier)) if (mods.HasModifier(addModifier))
@@ -82,7 +82,7 @@ namespace OpenRA
return; return;
} }
if (mods.HasModifier(Modifiers.Alt)) if (mods.HasModifier(Modifiers.Alt) || MultiTapCount >= 2)
{ {
Game.viewport.Center(controlGroups[group]); Game.viewport.Center(controlGroups[group]);
return; return;

View File

@@ -171,10 +171,10 @@ namespace OpenRA.Widgets
{ {
if (e.KeyName.Length == 1 && char.IsDigit(e.KeyName[0])) if (e.KeyName.Length == 1 && char.IsDigit(e.KeyName[0]))
{ {
world.Selection.DoControlGroup(world, e.KeyName[0] - '0', e.Modifiers); world.Selection.DoControlGroup(world, e.KeyName[0] - '0', e.Modifiers, e.MultiTapCount);
return true; return true;
} }
else if (e.KeyName == "pause" || e.KeyName == "f3") else if (e.KeyName == Game.Settings.Keys.PauseKey)
{ {
world.IssueOrder(Order.PauseRequest()); world.IssueOrder(Order.PauseRequest());
} }

View File

@@ -137,9 +137,13 @@ namespace OpenRA.Mods.RA.Widgets.Logic
specialHotkeyList.AddChild(viewportToBase); specialHotkeyList.AddChild(viewportToBase);
var lastEventKey = ScrollItemWidget.Setup(specialHotkeyTemplate, () => false, () => {}); var lastEventKey = ScrollItemWidget.Setup(specialHotkeyTemplate, () => false, () => {});
SetupKeyBinding(lastEventKey, "Move Viewport to Last Event:", () => keyConfig.GotoLastEventKey, k => keyConfig.GotoLastEventKey = k); SetupKeyBinding(lastEventKey, "Move Viewport to Last Event:", () => keyConfig.ToLastEventKey, k => keyConfig.ToLastEventKey = k);
specialHotkeyList.AddChild(lastEventKey); specialHotkeyList.AddChild(lastEventKey);
var viewportToSelectionKey = ScrollItemWidget.Setup(specialHotkeyTemplate, () => false, () => {});
SetupKeyBinding(viewportToSelectionKey, "Move Viewport to Selection:", () => keyConfig.ToSelectionKey, k => keyConfig.ToSelectionKey = k);
specialHotkeyList.AddChild(viewportToSelectionKey);
var sellKey = ScrollItemWidget.Setup(specialHotkeyTemplate, () => false, () => {}); var sellKey = ScrollItemWidget.Setup(specialHotkeyTemplate, () => false, () => {});
SetupKeyBinding(sellKey, "Switch to Sell-Cursor:", () => keyConfig.SellKey, k => keyConfig.SellKey = k); SetupKeyBinding(sellKey, "Switch to Sell-Cursor:", () => keyConfig.SellKey, k => keyConfig.SellKey = k);
specialHotkeyList.AddChild(sellKey); specialHotkeyList.AddChild(sellKey);

View File

@@ -1,6 +1,6 @@
#region Copyright & License Information #region Copyright & License Information
/* /*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS) * Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made * 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 * available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information, * as published by the Free Software Foundation. For more information,
@@ -47,8 +47,11 @@ namespace OpenRA.Mods.RA.Widgets
if (e.KeyName == Game.Settings.Keys.CycleBaseKey) if (e.KeyName == Game.Settings.Keys.CycleBaseKey)
return CycleBases(); return CycleBases();
if (e.KeyName == Game.Settings.Keys.GotoLastEventKey) if (e.KeyName == Game.Settings.Keys.ToLastEventKey)
return GotoLastEvent(); return ToLastEvent();
if (e.KeyName == Game.Settings.Keys.ToSelectionKey)
return ToSelection();
if (e.KeyName == Game.Settings.Keys.SellKey) if (e.KeyName == Game.Settings.Keys.SellKey)
return PerformSwitchToSellMode(); return PerformSwitchToSellMode();
@@ -168,11 +171,11 @@ namespace OpenRA.Mods.RA.Widgets
next = bases.Select(b => b.Actor).First(); next = bases.Select(b => b.Actor).First();
World.Selection.Combine(World, new Actor[] { next }, false, true); World.Selection.Combine(World, new Actor[] { next }, false, true);
Game.viewport.Center(World.Selection.Actors);
return true; return ToSelection();
} }
bool GotoLastEvent() bool ToLastEvent()
{ {
if (World.LocalPlayer == null) if (World.LocalPlayer == null)
return true; return true;
@@ -188,6 +191,12 @@ namespace OpenRA.Mods.RA.Widgets
return true; return true;
} }
bool ToSelection()
{
Game.viewport.Center(World.Selection.Actors);
return true;
}
bool PerformSwitchToSellMode() bool PerformSwitchToSellMode()
{ {
World.ToggleInputMode<SellOrderGenerator>(); World.ToggleInputMode<SellOrderGenerator>();

View File

@@ -1,6 +1,6 @@
#region Copyright & License Information #region Copyright & License Information
/* /*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS) * Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made * 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 * available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information, * as published by the Free Software Foundation. For more information,
@@ -25,11 +25,23 @@ public static class MultiTapDetection
return clickHistory.GetTapCount(xy); return clickHistory.GetTapCount(xy);
} }
public static int InfoFromMouse(byte MBName)
{
var clickHistory = ClickHistoryCache[MBName];
return clickHistory.LastTapCount();
}
public static int DetectFromKeyboard(string KeyName) public static int DetectFromKeyboard(string KeyName)
{ {
var keyHistory = KeyHistoryCache[KeyName]; var keyHistory = KeyHistoryCache[KeyName];
return keyHistory.GetTapCount(int2.Zero); return keyHistory.GetTapCount(int2.Zero);
} }
public static int InfoFromKeyboard(string KeyName)
{
var keyHistory = KeyHistoryCache[KeyName];
return keyHistory.LastTapCount();
}
} }
class TapHistory class TapHistory
@@ -57,4 +69,11 @@ class TapHistory
if (!CloseEnough(SecondRelease, FirstRelease)) return 2; if (!CloseEnough(SecondRelease, FirstRelease)) return 2;
return 3; return 3;
} }
public int LastTapCount()
{
if (!CloseEnough(ThirdRelease, SecondRelease)) return 1;
if (!CloseEnough(SecondRelease, FirstRelease)) return 2;
return 3;
}
} }

View File

@@ -67,8 +67,12 @@ namespace OpenRA.Renderer.SdlCommon
var button = MakeButton( e.button.button ); var button = MakeButton( e.button.button );
lastButtonBits |= button; lastButtonBits |= button;
inputHandler.OnMouseInput( new MouseInput( var pos = new int2( e.button.x, e.button.y );
MouseInputEvent.Down, button, new int2( e.button.x, e.button.y ), mods, 1 ) );
inputHandler.OnMouseInput(new MouseInput(
MouseInputEvent.Down, button, pos, mods,
MultiTapDetection.DetectFromMouse(e.button.button, pos)
));
} break; } break;
case Sdl.SDL_MOUSEBUTTONUP: case Sdl.SDL_MOUSEBUTTONUP:
@@ -83,9 +87,10 @@ namespace OpenRA.Renderer.SdlCommon
lastButtonBits &= ~button; lastButtonBits &= ~button;
var pos = new int2( e.button.x, e.button.y ); var pos = new int2( e.button.x, e.button.y );
inputHandler.OnMouseInput( new MouseInput( inputHandler.OnMouseInput(new MouseInput(
MouseInputEvent.Up, button, pos, mods, MouseInputEvent.Up, button, pos, mods,
MultiTapDetection.DetectFromMouse( e.button.button, pos ))); MultiTapDetection.InfoFromMouse(e.button.button)
));
} break; } break;
case Sdl.SDL_MOUSEMOTION: case Sdl.SDL_MOUSEMOTION:
@@ -99,13 +104,16 @@ namespace OpenRA.Renderer.SdlCommon
case Sdl.SDL_KEYDOWN: case Sdl.SDL_KEYDOWN:
{ {
var keyName = Sdl.SDL_GetKeyName( e.key.keysym.sym );
var keyEvent = new KeyInput var keyEvent = new KeyInput
{ {
Event = KeyInputEvent.Down, Event = KeyInputEvent.Down,
Modifiers = mods, Modifiers = mods,
UnicodeChar = (char)e.key.keysym.unicode, UnicodeChar = (char)e.key.keysym.unicode,
KeyName = Sdl.SDL_GetKeyName( e.key.keysym.sym ), KeyName = Sdl.SDL_GetKeyName( e.key.keysym.sym ),
VirtKey = e.key.keysym.sym VirtKey = e.key.keysym.sym,
MultiTapCount = MultiTapDetection.DetectFromKeyboard(keyName)
}; };
if( !HandleSpecialKey( keyEvent ) ) if( !HandleSpecialKey( keyEvent ) )
@@ -123,7 +131,7 @@ namespace OpenRA.Renderer.SdlCommon
UnicodeChar = (char)e.key.keysym.unicode, UnicodeChar = (char)e.key.keysym.unicode,
KeyName = Sdl.SDL_GetKeyName( e.key.keysym.sym ), KeyName = Sdl.SDL_GetKeyName( e.key.keysym.sym ),
VirtKey = e.key.keysym.sym, VirtKey = e.key.keysym.sym,
MultiTapCount = MultiTapDetection.DetectFromKeyboard(keyName) MultiTapCount = MultiTapDetection.InfoFromKeyboard(keyName)
}; };
inputHandler.OnKeyInput( keyEvent ); inputHandler.OnKeyInput( keyEvent );