Implement input config.

This commit is contained in:
2022-10-14 11:18:52 +08:00
parent 23ed127a1b
commit d3cac8a28d
10 changed files with 192 additions and 69 deletions

View File

@@ -1,6 +1,7 @@
using Cryville.Common.Unity.Input;
using System;
using System.Collections.Generic;
using System.Xml.Linq;
namespace Cryville.Crtr {
public class InputProxy {
@@ -25,61 +26,70 @@ namespace Cryville.Crtr {
}
public void Set(InputProxyEntry proxy) {
var name = proxy.Target;
if (_use[name] > 0)
if (_hash1.ContainsKey(name)) Remove(proxy);
if (_use[proxy.Target] > 0)
throw new InvalidOperationException("Input already assigned");
_hash1.Add(proxy.Target, proxy);
_hash2.Add(proxy.Source, proxy);
if (proxy != null) {
if (proxy.Source != null) {
_hash1.Add(proxy.Target, proxy);
_hash2.Add(proxy.Source.Value, proxy);
IncrementUseRecursive(name);
IncrementReversedUseRecursive(name);
}
else {
DecrementUseRecursive(name);
DecrementReversedUseRecursive(name);
}
}
void Remove(InputProxyEntry proxy) {
var name = proxy.Target;
_hash2.Remove(_hash1[name].Source.Value);
_hash1.Remove(name);
DecrementUseRecursive(name);
DecrementReversedUseRecursive(name);
}
public bool IsUsed(InputSource src) {
return _hash2.ContainsKey(src);
}
void IncrementUseRecursive(string name) {
_use[name]++;
BroadcastProxyChanged(name);
var passes = _ruleset.inputs[name].pass;
if (passes != null) {
foreach (var p in _ruleset.inputs[name].pass)
foreach (var p in _ruleset.inputs[name].pass) {
_use[p.Key]++;
IncrementUseRecursive(p.Key);
}
}
}
void IncrementReversedUseRecursive(string name) {
foreach (var p in _rev[name]) {
_use[name]++;
BroadcastProxyChanged(name);
_use[p]++;
BroadcastProxyChanged(p);
IncrementReversedUseRecursive(p);
}
}
void DecrementUseRecursive(string name) {
_use[name]--;
BroadcastProxyChanged(name);
var passes = _ruleset.inputs[name].pass;
if (passes != null) {
foreach (var p in _ruleset.inputs[name].pass)
foreach (var p in _ruleset.inputs[name].pass) {
_use[p.Key]--;
DecrementUseRecursive(p.Key);
}
}
}
void DecrementReversedUseRecursive(string name) {
foreach (var p in _rev[name]) {
_use[name]--;
BroadcastProxyChanged(name);
_use[p]--;
BroadcastProxyChanged(p);
DecrementReversedUseRecursive(p);
}
}
void BroadcastProxyChanged(string name) {
ProxyChanged(this, new ProxyChangedEventArgs(name, _hash1[name].Source, _use[name] > 0));
ProxyChanged(this, new ProxyChangedEventArgs(name, _hash1.ContainsKey(name) ? _hash1[name].Source : null, _use[name] > 0));
}
}
public class ProxyChangedEventArgs : EventArgs {
public string Name { get; private set; }
public InputSource Proxy { get; private set; }
public InputSource? Proxy { get; private set; }
public bool Used { get; private set; }
public ProxyChangedEventArgs(string name, InputSource src, bool used) {
public ProxyChangedEventArgs(string name, InputSource? src, bool used) {
Name = name;
Proxy = src;
Used = used;
@@ -87,7 +97,7 @@ namespace Cryville.Crtr {
}
public class InputProxyEntry {
public InputSource Source { get; set; }
public InputSource? Source { get; set; }
public string Target { get; set; }
public byte[] Mapping { get; private set; }
}