diff --git a/Assets/Cryville/Crtr/Browsing/UI/RulesetConfigBrowser.cs b/Assets/Cryville/Crtr/Browsing/UI/RulesetConfigBrowser.cs index 1c2c61a..bd75bb7 100644 --- a/Assets/Cryville/Crtr/Browsing/UI/RulesetConfigBrowser.cs +++ b/Assets/Cryville/Crtr/Browsing/UI/RulesetConfigBrowser.cs @@ -25,9 +25,11 @@ namespace Cryville.Crtr.Browsing.UI { public RulesetDefinition ruleset; RulesetConfig _rscfg; + string _rulesetName; bool _loaded; public void Load(string rulesetName) { + _rulesetName = rulesetName; FileInfo file = new FileInfo(Path.Combine( Game.GameDataPath, "rulesets", rulesetName, ".umgr" )); @@ -59,12 +61,7 @@ namespace Cryville.Crtr.Browsing.UI { m_genericConfigPanel.Adapter = new DefaultPropertyMasterAdapter(_rscfg.generic); m_rulesetConfigPanel.Adapter = new RulesetConfigPropertyMasterAdapter(ruleset.Root.configs, _rscfg.configs); - - //var proxy = new InputProxy(ruleset.Root, null, new Vector2(Screen.width, Screen.height)); - //proxy.LoadFrom(_rscfg.inputs); - //m_inputConfigPanel.proxy = proxy; - - //m_inputConfigPanel.OnConfigEnable(); + m_inputConfigPanel.Load(ruleset.Root, _rscfg); _loaded = true; } @@ -78,15 +75,13 @@ namespace Cryville.Crtr.Browsing.UI { void OnDisable() { if (_loaded) { - //m_inputConfigPanel.proxy.SaveTo(_rscfg.inputs); - //m_inputConfigPanel.proxy.Dispose(); - //FileInfo cfgfile = new FileInfo(Path.Combine( - // Game.GameDataPath, "config", "rulesets", Settings.Default.LoadRulesetConfig - //)); - //using (StreamWriter cfgwriter = new StreamWriter(cfgfile.FullName, false, Encoding.UTF8)) { - // cfgwriter.Write(JsonConvert.SerializeObject(_rscfg, Game.GlobalJsonSerializerSettings)); - //} - //m_inputConfigPanel.OnConfigDisable(); + m_inputConfigPanel.SaveTo(_rscfg.inputs); + FileInfo cfgFile = new FileInfo(Path.Combine( + Game.GameDataPath, "config", "rulesets", _rulesetName + ".json" + )); + using (StreamWriter cfgWriter = new StreamWriter(cfgFile.FullName, false, Encoding.UTF8)) { + cfgWriter.Write(JsonConvert.SerializeObject(_rscfg, Game.GlobalJsonSerializerSettings)); + } } } diff --git a/Assets/Cryville/Crtr/Config/UI/InputConfigPanel.cs b/Assets/Cryville/Crtr/Config/UI/InputConfigPanel.cs index ed311a0..59c5303 100644 --- a/Assets/Cryville/Crtr/Config/UI/InputConfigPanel.cs +++ b/Assets/Cryville/Crtr/Config/UI/InputConfigPanel.cs @@ -4,155 +4,51 @@ using Cryville.Input; using System; using System.Collections.Generic; using UnityEngine; -using UnityEngine.UI; namespace Cryville.Crtr.Config.UI { - public class InputConfigPanel : MonoBehaviour { - [SerializeField] - ConfigPanelMaster m_configScene; - - [SerializeField] - GameObject m_inputDialog; - - [SerializeField] - Transform m_deviceList; - - [SerializeField] - GameObject m_prefabListItem; - + internal class InputConfigPanel : MonoBehaviour { [SerializeField] Transform m_entryList; [SerializeField] GameObject m_prefabInputConfigEntry; - SimpleInputConsumer _consumer; - public InputProxy proxy; + PdtRuleset _ruleset; + InputProxy _proxy; readonly Dictionary _entries = new Dictionary(); - int _applicableEntries; - Identifier _sel; - int _targetDim; - PhysicalDimension? _targetPDim; - bool _targetNotNull; - public void OpenDialog(Identifier entry) { - _sel = entry; - var def = m_configScene.ruleset.Root.inputs[_sel]; - _targetDim = def.dim; - if (def.pdim != null) _targetPDim = ParsePhysicalDimension(def.pdim); - else _targetPDim = null; - _targetNotNull = def.notnull; - m_inputDialog.SetActive(true); - foreach (Transform i in m_deviceList) Destroy(i.gameObject); - _consumer.EnumerateEvents(ev => { }); - _recvsrcs.Clear(); - _applicableEntries = 1; - AddSourceItem(null); - } + public void Load(PdtRuleset ruleset, RulesetConfig rulesetConfig) { + _ruleset = ruleset; + _proxy = new InputProxy(ruleset, null, new Vector2(Screen.width, Screen.height)); + _proxy.LoadFrom(rulesetConfig.inputs); - static PhysicalDimension ParsePhysicalDimension(string str) { - var comps = str.Split(' ', StringSplitOptions.RemoveEmptyEntries); - var result = new PhysicalDimension(); - foreach (var comp in comps) { - int dim = 1; - if (comp.Length > 1) dim = int.Parse(comp.Substring(1)); - switch (comp[0]) { - case 'T': result.Time += dim; break; - case 'L': result.Length += dim; break; - case 'M': result.Mass += dim; break; - case 'I': result.ElectricCurrent += dim; break; - case '\x0398': - case 'H': result.ThermodynamicTemperature += dim; break; - case 'N': result.AmountOfSubstance += dim; break; - case 'J': result.LuminousIntensity += dim; break; - default: throw new ArgumentException(string.Format("Invalid dimension symbol {0}", comp[0])); - } - } - return result; - } - - public void CloseDialog() { - m_inputDialog.SetActive(false); - } - - public void CloseDialog(InputSource? src) { - proxy.Set(new InputProxyEntry { - Target = _sel, - Source = src, - }); - CloseDialog(); - } - - public void OnConfigEnable() { - foreach (Transform i in m_entryList) Destroy(i.gameObject); - _entries.Clear(); - _consumer = new SimpleInputConsumer(Game.InputManager); - _consumer.Activate(); - foreach (var i in m_configScene.ruleset.Root.inputs) { - var e = Instantiate(m_prefabInputConfigEntry, m_entryList.transform).GetComponent(); + foreach (var i in ruleset.inputs) { + var e = Instantiate(m_prefabInputConfigEntry, m_entryList.transform, false).GetComponent(); _entries.Add(i.Key, e); e.SetKey(this, i.Key); - OnProxyChanged(this, proxy[i.Key]); + OnProxyChanged(this, _proxy[i.Key]); } - proxy.ProxyChanged += OnProxyChanged; + _proxy.ProxyChanged += OnProxyChanged; } - public void OnConfigDisable() { - _consumer.Deactivate(); + Identifier _selectedEntry; + public void OpenDialog(Identifier entry) { + _selectedEntry = entry; + InputDialog.Show(OnDialogClosed, "Please input and select a device", _ruleset.inputs[entry], _proxy); + } + public void OnDialogClosed(InputSource? src) { + _proxy.Set(new InputProxyEntry { + Target = _selectedEntry, + Source = src, + }); } void OnProxyChanged(object sender, ProxyChangedEventArgs e) { _entries[e.Name].OnProxyChanged(e); } - void Start() { - _d_HandleInputEvent = HandleInputEvent; - } - - readonly List _recvsrcs = new List(); - void Update() { - if (m_inputDialog.activeSelf) { - _consumer.EnumerateEvents(_d_HandleInputEvent); - } - } - - Action _d_HandleInputEvent; - void HandleInputEvent(InputEvent ev) { - AddSourceItem(ev.Identifier.Source); - } - - void AddSourceItem(InputSource? src) { - if (_recvsrcs.Contains(src)) return; - _recvsrcs.Add(src); - var obj = Instantiate(m_prefabListItem, m_deviceList); - var text = obj.transform.Find("Text").GetComponent(); - text.text = src == null ? "(None)" : src.Value.Handler.GetTypeName(src.Value.Type); - var btn = obj.GetComponent