Keyboard support for production palette:

y/u/i/o/p map to Buildings/Defense/Infantry/Vehicles/Aircraft.
Tab or successive y/u/i/o/p will switch tabs within a category.
Successive clicks on category icons will also switch tabs.
Shift + keyboard/click cycles tabs in reverse.
This commit is contained in:
Paul Chote
2011-07-03 08:18:29 +12:00
parent c1f7152857
commit a065ba0338
3 changed files with 65 additions and 30 deletions

View File

@@ -23,6 +23,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
MenuType menu = MenuType.None;
Widget ingameRoot;
ProductionTabsWidget queueTabs;
World world;
void AddChatLine(Color c, string from, string text)
@@ -35,19 +36,37 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
Game.AddChatLine -= AddChatLine;
Game.BeforeGameStart -= UnregisterEvents;
if (world.LocalPlayer != null)
if (queueTabs != null)
{
var queueTabs = ingameRoot.GetWidget<ProductionTabsWidget>("PRODUCTION_TABS");
world.ActorAdded += queueTabs.ActorChanged;
world.ActorRemoved += queueTabs.ActorChanged;
}
}
ProductionQueue QueueForType(World world, string type)
void SetupProductionGroupButton(ButtonWidget button, string group)
{
return world.ActorsWithTrait<ProductionQueue>()
.Where(p => p.Actor.Owner == world.LocalPlayer)
.Select(p => p.Trait).FirstOrDefault(p => p.Info.Type == type);
button.IsDisabled = () => queueTabs.Groups[group].Tabs.Count == 0;
button.OnMouseUp = mi =>
{
if (button.IsDisabled())
return true;
if (queueTabs.QueueType == group)
queueTabs.SelectNextTab(mi.Modifiers.HasModifier(Modifiers.Shift));
else
queueTabs.QueueType = group;
return true;
};
button.OnKeyPress = e =>
{
if (queueTabs.QueueType == group)
queueTabs.SelectNextTab(e.Modifiers.HasModifier(Modifiers.Shift));
else
queueTabs.QueueType = group;
};
}
[ObjectCreator.UseCtor]
@@ -83,34 +102,18 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
sidebarRoot.GetWidget<LabelWidget>("CASH_DISPLAY").GetText = () =>
"${0}".F(playerResources.DisplayCash + playerResources.DisplayOre);
var buildPalette = playerWidgets.GetWidget<ProductionPaletteWidget>("PRODUCTION_PALETTE");
var queueTabs = playerWidgets.GetWidget<ProductionTabsWidget>("PRODUCTION_TABS");
queueTabs = playerWidgets.GetWidget<ProductionTabsWidget>("PRODUCTION_TABS");
world.ActorAdded += queueTabs.ActorChanged;
world.ActorRemoved += queueTabs.ActorChanged;
var queueTypes = sidebarRoot.GetWidget("PRODUCTION_TYPES");
var buildingTab = queueTypes.GetWidget<ButtonWidget>("BUILDING");
buildingTab.OnClick = () => queueTabs.QueueType = "Building";
buildingTab.IsDisabled = () => queueTabs.Groups["Building"].Tabs.Count == 0;
var defenseTab = queueTypes.GetWidget<ButtonWidget>("DEFENSE");
defenseTab.OnClick = () => queueTabs.QueueType = "Defense";
defenseTab.IsDisabled = () => queueTabs.Groups["Defense"].Tabs.Count == 0;
var infantryTab = queueTypes.GetWidget<ButtonWidget>("INFANTRY");
infantryTab.OnClick = () => queueTabs.QueueType = "Infantry";
infantryTab.IsDisabled = () => queueTabs.Groups["Infantry"].Tabs.Count == 0;
var vehicleTab = queueTypes.GetWidget<ButtonWidget>("VEHICLE");
vehicleTab.OnClick = () => queueTabs.QueueType = "Vehicle";
vehicleTab.IsDisabled = () => queueTabs.Groups["Vehicle"].Tabs.Count == 0;
var aircraftTab = queueTypes.GetWidget<ButtonWidget>("AIRCRAFT");
aircraftTab.OnClick = () => queueTabs.QueueType = "Aircraft";
aircraftTab.IsDisabled = () => queueTabs.Groups["Aircraft"].Tabs.Count == 0;
SetupProductionGroupButton(queueTypes.GetWidget<ButtonWidget>("BUILDING"), "Building");
SetupProductionGroupButton(queueTypes.GetWidget<ButtonWidget>("DEFENSE"), "Defense");
SetupProductionGroupButton(queueTypes.GetWidget<ButtonWidget>("INFANTRY"), "Infantry");
SetupProductionGroupButton(queueTypes.GetWidget<ButtonWidget>("VEHICLE"), "Vehicle");
SetupProductionGroupButton(queueTypes.GetWidget<ButtonWidget>("AIRCRAFT"), "Aircraft");
}
ingameRoot.GetWidget<ButtonWidget>("OPTIONS_BUTTON").OnClick = () =>
{
if (menu != MenuType.None)

View File

@@ -213,6 +213,33 @@ namespace OpenRA.Mods.Cnc.Widgets
return (leftPressed || rightPressed);
}
public override bool HandleKeyPressInner(KeyInput e)
{
if (e.Event != KeyInputEvent.Down) return false;
if (e.KeyName == "tab")
{
SelectNextTab(e.Modifiers.HasModifier(Modifiers.Shift));
return true;
}
return false;
}
public void SelectNextTab(bool reverse)
{
if (queueType == null)
return;
var pal = Widget.RootWidget.GetWidget<ProductionPaletteWidget>(PaletteWidget);
var tabs = Groups[queueType].Tabs.ToList();
if (reverse) tabs.Reverse();
var tab = tabs.SkipWhile(q => q.Queue != pal.CurrentQueue)
.Skip(1).FirstOrDefault() ?? tabs.FirstOrDefault();
pal.CurrentQueue = tab != null ? tab.Queue : null;
}
public void SelectQueue(ProductionQueue queue)
{
QueueType = queue.Info.Group;

View File

@@ -185,30 +185,35 @@ Container@INGAME_ROOT:
Width:30
Height:30
Text: B
Key: y
Button@DEFENSE:
Id:DEFENSE
X:35
Width:30
Height:30
Text: D
Key: u
Button@INFANTRY:
Id:INFANTRY
X:70
Width:30
Height:30
Text: I
Key: i
Button@VEHICLE:
Id:VEHICLE
X:105
Width:30
Height:30
Text: V
Key: o
Button@AIRCRAFT:
Id:AIRCRAFT
X:140
Width:30
Height:30
Text: H
Key: p
ProductionTabs:
Id:PRODUCTION_TABS
PaletteWidget:PRODUCTION_PALETTE