Migrate input settings to HotkeyManager.

This commit is contained in:
Paul Chote
2017-11-05 21:11:14 +00:00
committed by abcdefg30
parent 2f79173044
commit 74c390d1d0
3 changed files with 147 additions and 313 deletions

View File

@@ -34,6 +34,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
readonly ModData modData; readonly ModData modData;
readonly WorldRenderer worldRenderer; readonly WorldRenderer worldRenderer;
readonly Dictionary<string, MiniYaml> logicArgs;
SoundDevice soundDevice; SoundDevice soundDevice;
PanelType settingsPanel = PanelType.Display; PanelType settingsPanel = PanelType.Display;
@@ -49,10 +50,11 @@ namespace OpenRA.Mods.Common.Widgets.Logic
} }
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public SettingsLogic(Widget widget, Action onExit, ModData modData, WorldRenderer worldRenderer) public SettingsLogic(Widget widget, Action onExit, ModData modData, WorldRenderer worldRenderer, Dictionary<string, MiniYaml> logicArgs)
{ {
this.worldRenderer = worldRenderer; this.worldRenderer = worldRenderer;
this.modData = modData; this.modData = modData;
this.logicArgs = logicArgs;
panelContainer = widget.Get("SETTINGS_PANEL"); panelContainer = widget.Get("SETTINGS_PANEL");
tabContainer = widget.Get("TAB_CONTAINER"); tabContainer = widget.Get("TAB_CONTAINER");
@@ -122,21 +124,17 @@ namespace OpenRA.Mods.Common.Widgets.Logic
ss.OnChange += x => field.SetValue(group, x); ss.OnChange += x => field.SetValue(group, x);
} }
static void BindHotkeyPref(KeyValuePair<string, string> kv, KeySettings ks, Widget template, Widget parent) static void BindHotkeyPref(HotkeyDefinition hd, HotkeyManager manager, Widget template, Widget parent)
{ {
var key = template.Clone() as Widget; var key = template.Clone() as Widget;
key.Id = kv.Key; key.Id = hd.Name;
key.IsVisible = () => true; key.IsVisible = () => true;
var field = ks.GetType().GetField(kv.Key); key.Get<LabelWidget>("FUNCTION").GetText = () => hd.Description + ":";
if (field == null)
throw new InvalidOperationException("Game.Settings.Keys does not contain {1}".F(kv.Key));
key.Get<LabelWidget>("FUNCTION").GetText = () => kv.Value + ":";
var textBox = key.Get<HotkeyEntryWidget>("HOTKEY"); var textBox = key.Get<HotkeyEntryWidget>("HOTKEY");
textBox.Key = (Hotkey)field.GetValue(ks); textBox.Key = manager[hd.Name].GetValue();
textBox.OnLoseFocus = () => field.SetValue(ks, textBox.Key); textBox.OnLoseFocus = () => manager.Set(hd.Name, textBox.Key);
parent.AddChild(key); parent.AddChild(key);
} }
@@ -379,7 +377,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic
Action InitInputPanel(Widget panel) Action InitInputPanel(Widget panel)
{ {
var gs = Game.Settings.Game; var gs = Game.Settings.Game;
var ks = Game.Settings.Keys;
BindCheckboxPref(panel, "CLASSICORDERS_CHECKBOX", gs, "UseClassicMouseStyle"); BindCheckboxPref(panel, "CLASSICORDERS_CHECKBOX", gs, "UseClassicMouseStyle");
BindCheckboxPref(panel, "EDGESCROLL_CHECKBOX", gs, "ViewportEdgeScroll"); BindCheckboxPref(panel, "EDGESCROLL_CHECKBOX", gs, "ViewportEdgeScroll");
@@ -415,202 +412,34 @@ namespace OpenRA.Mods.Common.Widgets.Logic
var hotkeyList = panel.Get<ScrollPanelWidget>("HOTKEY_LIST"); var hotkeyList = panel.Get<ScrollPanelWidget>("HOTKEY_LIST");
hotkeyList.Layout = new GridLayout(hotkeyList); hotkeyList.Layout = new GridLayout(hotkeyList);
var hotkeyHeader = hotkeyList.Get<ScrollItemWidget>("HEADER"); var hotkeyHeader = hotkeyList.Get<ScrollItemWidget>("HEADER");
var globalTemplate = hotkeyList.Get("GLOBAL_TEMPLATE"); var templates = hotkeyList.Get("TEMPLATES");
var unitTemplate = hotkeyList.Get("UNIT_TEMPLATE");
var productionTemplate = hotkeyList.Get("PRODUCTION_TEMPLATE");
var developerTemplate = hotkeyList.Get("DEVELOPER_TEMPLATE");
hotkeyList.RemoveChildren(); hotkeyList.RemoveChildren();
Func<bool> returnTrue = () => true; Func<bool> returnTrue = () => true;
Action doNothing = () => { }; Action doNothing = () => { };
// Game MiniYaml hotkeyGroups;
if (logicArgs.TryGetValue("HotkeyGroups", out hotkeyGroups))
{ {
var hotkeys = new Dictionary<string, string>() foreach (var hg in hotkeyGroups.Nodes)
{ {
{ "CycleBaseKey", "Jump to base" }, var templateNode = hg.Value.Nodes.FirstOrDefault(n => n.Key == "Template");
{ "ToLastEventKey", "Jump to last radar event" }, var typesNode = hg.Value.Nodes.FirstOrDefault(n => n.Key == "Types");
{ "ToSelectionKey", "Jump to selection" }, if (templateNode == null || typesNode == null)
{ "SelectAllUnitsKey", "Select all combat units" }, continue;
{ "SelectUnitsByTypeKey", "Select units by type" },
{ "PlaceBeaconKey", "Place beacon" }, var header = ScrollItemWidget.Setup(hotkeyHeader, returnTrue, doNothing);
header.Get<LabelWidget>("LABEL").GetText = () => hg.Key;
hotkeyList.AddChild(header);
{ "PauseKey", "Pause / Unpause" }, var types = FieldLoader.GetValue<string[]>("Types", typesNode.Value.Value);
{ "SellKey", "Sell mode" }, var added = new HashSet<HotkeyDefinition>();
{ "PowerDownKey", "Power-down mode" }, var template = templates.Get(templateNode.Value.Value);
{ "RepairKey", "Repair mode" }, foreach (var t in types)
foreach (var hd in modData.Hotkeys.Definitions.Where(k => k.Types.Contains(t)))
{ "NextProductionTabKey", "Next production tab" }, if (added.Add(hd))
{ "PreviousProductionTabKey", "Previous production tab" }, BindHotkeyPref(hd, modData.Hotkeys, template, hotkeyList);
{ "CycleProductionBuildingsKey", "Cycle production facilities" }, }
{ "CycleStatusBarsKey", "Cycle status bars display" },
{ "TogglePixelDoubleKey", "Toggle pixel doubling" },
{ "ToggleMuteKey", "Toggle audio mute" },
{ "TogglePlayerStanceColorKey", "Toggle player stance colors" },
{ "TakeScreenshotKey", "Take screenshot" }
};
var header = ScrollItemWidget.Setup(hotkeyHeader, returnTrue, doNothing);
header.Get<LabelWidget>("LABEL").GetText = () => "Game Commands";
hotkeyList.AddChild(header);
foreach (var kv in hotkeys)
BindHotkeyPref(kv, ks, globalTemplate, hotkeyList);
}
// Viewport
{
var hotkeys = new Dictionary<string, string>()
{
{ "MapScrollUpKey", "Scroll up" },
{ "MapScrollDownKey", "Scroll down" },
{ "MapScrollLeftKey", "Scroll left" },
{ "MapScrollRightKey", "Scroll right" },
{ "MapJumpToTopEdgeKey", "Jump to top edge" },
{ "MapJumpToBottomEdgeKey", "Jump to bottom edge" },
{ "MapJumpToLeftEdgeKey", "Jump to left edge" },
{ "MapJumpToRightEdgeKey", "Jump to right edge" },
{ "MapBookmarkSave01Key", "Record bookmark #1" },
{ "MapBookmarkRestore01Key", "Jump to bookmark #1" },
{ "MapBookmarkSave02Key", "Record bookmark #2" },
{ "MapBookmarkRestore02Key", "Jump to bookmark #2" },
{ "MapBookmarkSave03Key", "Record bookmark #3" },
{ "MapBookmarkRestore03Key", "Jump to bookmark #3" },
{ "MapBookmarkSave04Key", "Record bookmark #4" },
{ "MapBookmarkRestore04Key", "Jump to bookmark #4" }
};
var header = ScrollItemWidget.Setup(hotkeyHeader, returnTrue, doNothing);
header.Get<LabelWidget>("LABEL").GetText = () => "Viewport Commands";
hotkeyList.AddChild(header);
foreach (var kv in hotkeys)
BindHotkeyPref(kv, ks, globalTemplate, hotkeyList);
}
// Observer
{
var hotkeys = new Dictionary<string, string>()
{
{ "ObserverCombinedViewKey", "All Players" },
{ "ObserverWorldViewKey", "Disable Shroud" },
{ "PauseKey", "Pause/Play" },
{ "ReplaySpeedSlowKey", "Slow speed" },
{ "ReplaySpeedRegularKey", "Regular speed" },
{ "ReplaySpeedFastKey", "Fast speed" },
{ "ReplaySpeedMaxKey", "Maximum speed" },
{ "StatisticsBasicKey", "Basic statistics" },
{ "StatisticsEconomyKey", "Economy statistics" },
{ "StatisticsProductionKey", "Production statistics" },
{ "StatisticsCombatKey", "Combat statistics" },
{ "StatisticsGraphKey", "Statistics graph" }
};
var header = ScrollItemWidget.Setup(hotkeyHeader, returnTrue, doNothing);
header.Get<LabelWidget>("LABEL").GetText = () => "Observer Commands";
hotkeyList.AddChild(header);
foreach (var kv in hotkeys)
BindHotkeyPref(kv, ks, globalTemplate, hotkeyList);
}
// Unit
{
var hotkeys = new Dictionary<string, string>()
{
{ "AttackMoveKey", "Attack Move" },
{ "StopKey", "Stop" },
{ "ScatterKey", "Scatter" },
{ "DeployKey", "Deploy" },
{ "GuardKey", "Guard" }
};
var header = ScrollItemWidget.Setup(hotkeyHeader, returnTrue, doNothing);
header.Get<LabelWidget>("LABEL").GetText = () => "Unit Commands";
hotkeyList.AddChild(header);
foreach (var kv in hotkeys)
BindHotkeyPref(kv, ks, unitTemplate, hotkeyList);
}
// Unit stance
{
var hotkeys = new Dictionary<string, string>()
{
{ "StanceHoldFireKey", "Hold fire" },
{ "StanceReturnFireKey", "Return fire" },
{ "StanceDefendKey", "Defend" },
{ "StanceAttackAnythingKey", "Attack anything" }
};
var header = ScrollItemWidget.Setup(hotkeyHeader, returnTrue, doNothing);
header.Get<LabelWidget>("LABEL").GetText = () => "Unit Stance Commands";
hotkeyList.AddChild(header);
foreach (var kv in hotkeys)
BindHotkeyPref(kv, ks, globalTemplate, hotkeyList);
}
// Production
{
var hotkeys = new Dictionary<string, string>()
{
{ "ProductionTypeBuildingKey", "Building Tab" },
{ "ProductionTypeDefenseKey", "Defense Tab" },
{ "ProductionTypeInfantryKey", "Infantry Tab" },
{ "ProductionTypeVehicleKey", "Vehicle Tab" },
{ "ProductionTypeAircraftKey", "Aircraft Tab" },
{ "ProductionTypeNavalKey", "Naval Tab" },
{ "ProductionTypeTankKey", "Tank Tab" },
{ "ProductionTypeMerchantKey", "Starport Tab" },
{ "ProductionTypeUpgradeKey", "Upgrade Tab" }
};
for (var i = 1; i <= 24; i++)
hotkeys.Add("Production{0:D2}Key".F(i), "Slot {0}".F(i));
var header = ScrollItemWidget.Setup(hotkeyHeader, returnTrue, doNothing);
header.Get<LabelWidget>("LABEL").GetText = () => "Production Commands";
hotkeyList.AddChild(header);
foreach (var kv in hotkeys)
BindHotkeyPref(kv, ks, productionTemplate, hotkeyList);
}
// Support powers
{
var hotkeys = new Dictionary<string, string>();
for (var i = 1; i <= 6; i++)
hotkeys.Add("SupportPower{0:D2}Key".F(i), "Slot {0}".F(i));
var header = ScrollItemWidget.Setup(hotkeyHeader, returnTrue, doNothing);
header.Get<LabelWidget>("LABEL").GetText = () => "Support Power Commands";
hotkeyList.AddChild(header);
foreach (var kv in hotkeys)
BindHotkeyPref(kv, ks, productionTemplate, hotkeyList);
}
// Music
{
var hotkeys = new Dictionary<string, string>()
{
{ "StopMusicKey", "Stop" },
{ "PauseMusicKey", "Pause or Resume" },
{ "PrevMusicKey", "Previous" },
{ "NextMusicKey", "Next" }
};
var header = ScrollItemWidget.Setup(hotkeyHeader, returnTrue, doNothing);
header.Get<LabelWidget>("LABEL").GetText = () => "Music Commands";
hotkeyList.AddChild(header);
foreach (var kv in hotkeys)
BindHotkeyPref(kv, ks, developerTemplate, hotkeyList);
} }
return () => { }; return () => { };
@@ -619,9 +448,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
Action ResetInputPanel(Widget panel) Action ResetInputPanel(Widget panel)
{ {
var gs = Game.Settings.Game; var gs = Game.Settings.Game;
var ks = Game.Settings.Keys;
var dgs = new GameSettings(); var dgs = new GameSettings();
var dks = new KeySettings();
return () => return () =>
{ {
@@ -635,11 +462,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic
gs.AllowZoom = dgs.AllowZoom; gs.AllowZoom = dgs.AllowZoom;
gs.ZoomModifier = dgs.ZoomModifier; gs.ZoomModifier = dgs.ZoomModifier;
foreach (var f in ks.GetType().GetFields()) foreach (var hd in modData.Hotkeys.Definitions)
{ {
var value = (Hotkey)f.GetValue(dks); modData.Hotkeys.Set(hd.Name, hd.Default);
f.SetValue(ks, value); panel.Get(hd.Name).Get<HotkeyEntryWidget>("HOTKEY").Key = hd.Default;
panel.Get(f.Name).Get<HotkeyEntryWidget>("HOTKEY").Key = value;
} }
panel.Get<SliderWidget>("SCROLLSPEED_SLIDER").Value = gs.ViewportEdgeScrollStep; panel.Get<SliderWidget>("SCROLLSPEED_SLIDER").Value = gs.ViewportEdgeScrollStep;

View File

@@ -1,5 +1,30 @@
Container@SETTINGS_PANEL: Container@SETTINGS_PANEL:
Logic: SettingsLogic Logic: SettingsLogic
HotkeyGroups:
Game Commands:
Template: TWO_COLUMN
Types: World, Menu
Viewport Commands:
Template: TWO_COLUMN
Types: Viewport
Observer / Replay Commands:
Template: TWO_COLUMN
Types: Observer, Replay
Unit Commands:
Template: THREE_COLUMN
Types: Unit
Unit Stance Commands:
Template: TWO_COLUMN
Types: Stance
Production Commands:
Template: THREE_COLUMN
Types: Production
Support Power Commands:
Template: THREE_COLUMN
Types: SupportPower
Music Commands:
Template: TWO_COLUMN
Types: Music
X: (WINDOW_RIGHT - WIDTH) / 2 X: (WINDOW_RIGHT - WIDTH) / 2
Y: (WINDOW_BOTTOM - HEIGHT) / 2 Y: (WINDOW_BOTTOM - HEIGHT) / 2
Width: 590 Width: 590
@@ -449,62 +474,36 @@ Container@SETTINGS_PANEL:
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: 10 Height: 10
Align: Center Align: Center
Container@GLOBAL_TEMPLATE: Container@TEMPLATES:
Width: 262
Height: 25
Visible: false
Children: Children:
Label@FUNCTION: Container@TWO_COLUMN:
Y: 0 - 1 Width: 262
Width: PARENT_RIGHT - 85
Height: 25 Height: 25
Align: Right Visible: false
HotkeyEntry@HOTKEY: Children:
X: PARENT_RIGHT - WIDTH Label@FUNCTION:
Width: 80 Y: 0 - 1
Height: 25 Width: PARENT_RIGHT - 85
Container@UNIT_TEMPLATE: Height: 25
Width: 173 Align: Right
Height: 25 HotkeyEntry@HOTKEY:
Visible: false X: PARENT_RIGHT - WIDTH
Children: Width: 80
Label@FUNCTION: Height: 25
Y: 0 - 1 Container@THREE_COLUMN:
Width: PARENT_RIGHT - 84 Width: 173
Height: 25
Align: Right
HotkeyEntry@HOTKEY:
X: PARENT_RIGHT - WIDTH + 1
Width: 80
Height: 25
Container@PRODUCTION_TEMPLATE:
Width: 173
Height: 25
Visible: false
Children:
Label@FUNCTION:
Y: 0 - 1
Width: PARENT_RIGHT - 84
Height: 25
Align: Right
HotkeyEntry@HOTKEY:
X: PARENT_RIGHT - WIDTH + 1
Width: 80
Height: 25
Container@DEVELOPER_TEMPLATE:
Width: 262
Height: 25
Visible: false
Children:
Label@FUNCTION:
Y: 0 - 1
Width: PARENT_RIGHT - 115
Height: 25
Align: Right
HotkeyEntry@HOTKEY:
X: PARENT_RIGHT - WIDTH
Width: 110
Height: 25 Height: 25
Visible: false
Children:
Label@FUNCTION:
Y: 0 - 1
Width: PARENT_RIGHT - 84
Height: 25
Align: Right
HotkeyEntry@HOTKEY:
X: PARENT_RIGHT - WIDTH + 1
Width: 80
Height: 25
Container@ADVANCED_PANEL: Container@ADVANCED_PANEL:
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: PARENT_BOTTOM Height: PARENT_BOTTOM

View File

@@ -1,5 +1,30 @@
Background@SETTINGS_PANEL: Background@SETTINGS_PANEL:
Logic: SettingsLogic Logic: SettingsLogic
HotkeyGroups:
Game Commands:
Template: TWO_COLUMN
Types: World, Menu
Viewport Commands:
Template: TWO_COLUMN
Types: Viewport
Observer / Replay Commands:
Template: TWO_COLUMN
Types: Observer, Replay
Unit Commands:
Template: THREE_COLUMN
Types: Unit
Unit Stance Commands:
Template: TWO_COLUMN
Types: Stance
Production Commands:
Template: THREE_COLUMN
Types: Production
Support Power Commands:
Template: THREE_COLUMN
Types: SupportPower
Music Commands:
Template: TWO_COLUMN
Types: Music
X: (WINDOW_RIGHT - WIDTH) / 2 X: (WINDOW_RIGHT - WIDTH) / 2
Y: (WINDOW_BOTTOM - HEIGHT) / 2 Y: (WINDOW_BOTTOM - HEIGHT) / 2
Width: 600 Width: 600
@@ -454,62 +479,46 @@ Background@SETTINGS_PANEL:
Width: PARENT_RIGHT Width: PARENT_RIGHT
Height: 10 Height: 10
Align: Center Align: Center
Container@GLOBAL_TEMPLATE: ScrollItem@HEADER:
Width: 262 Width: 528
Height: 25 Height: 13
Visible: false Visible: false
Children: Children:
Label@FUNCTION: Label@LABEL:
Y: 0 - 1 Font: TinyBold
Width: PARENT_RIGHT - 85 Width: PARENT_RIGHT
Height: 25 Height: 10
Align: Right Align: Center
HotkeyEntry@HOTKEY: Container@TEMPLATES:
X: PARENT_RIGHT - WIDTH Children:
Width: 80 Container@TWO_COLUMN:
Height: 25 Width: 262
Container@UNIT_TEMPLATE: Height: 25
Width: 173 Visible: false
Height: 25 Children:
Visible: false Label@FUNCTION:
Children: Y: 0 - 1
Label@FUNCTION: Width: PARENT_RIGHT - 85
Y: 0 - 1 Height: 25
Width: PARENT_RIGHT - 84 Align: Right
Height: 25 HotkeyEntry@HOTKEY:
Align: Right X: PARENT_RIGHT - WIDTH
HotkeyEntry@HOTKEY: Width: 80
X: PARENT_RIGHT - WIDTH + 1 Height: 25
Width: 80 Container@THREE_COLUMN:
Height: 25 Width: 173
Container@PRODUCTION_TEMPLATE: Height: 25
Width: 173 Visible: false
Height: 25 Children:
Visible: false Label@FUNCTION:
Children: Y: 0 - 1
Label@FUNCTION: Width: PARENT_RIGHT - 84
Y: 0 - 1 Height: 25
Width: PARENT_RIGHT - 84 Align: Right
Height: 25 HotkeyEntry@HOTKEY:
Align: Right X: PARENT_RIGHT - WIDTH + 1
HotkeyEntry@HOTKEY: Width: 80
X: PARENT_RIGHT - WIDTH + 1 Height: 25
Width: 80
Height: 25
Container@DEVELOPER_TEMPLATE:
Width: 262
Height: 25
Visible: false
Children:
Label@FUNCTION:
Y: 0 - 1
Width: PARENT_RIGHT - 115
Height: 25
Align: Right
HotkeyEntry@HOTKEY:
X: PARENT_RIGHT - WIDTH
Width: 110
Height: 25
Container@ADVANCED_PANEL: Container@ADVANCED_PANEL:
X: 5 X: 5
Y: 50 Y: 50