using Cryville.Common; using Cryville.Common.Unity; using Cryville.Common.Unity.Input; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace Cryville.Crtr.Config { public class InputConfigPanel : MonoBehaviour { [SerializeField] ConfigPanelMaster m_configScene; [SerializeField] GameObject m_inputDialog; [SerializeField] Transform m_deviceList; [SerializeField] GameObject m_prefabListItem; [SerializeField] Transform m_entryList; [SerializeField] GameObject m_prefabInputConfigEntry; SimpleInputConsumer _consumer; public InputProxy proxy; readonly Dictionary _entries = new Dictionary(); Identifier _sel; public void OpenDialog(Identifier entry) { _sel = entry; m_inputDialog.SetActive(true); CallHelper.Purge(m_deviceList); _consumer.EnumerateEvents(ev => { }); _recvsrcs.Clear(); AddSourceItem(null); } public void CloseDialog() { m_inputDialog.SetActive(false); } public void CloseDialog(InputSource? src) { proxy.Set(new InputProxyEntry { Target = _sel, Source = src, }); CloseDialog(); } public void OnConfigEnable() { CallHelper.Purge(m_entryList); _entries.Clear(); _consumer = new SimpleInputConsumer(Game.InputManager); _consumer.Activate(); foreach (var i in m_configScene.ruleset.Root.inputs) { var e = GameObject.Instantiate(m_prefabInputConfigEntry, m_entryList.transform).GetComponent(); _entries.Add(i.Key, e); e.SetKey(this, i.Key); OnProxyChanged(this, proxy[i.Key]); } proxy.ProxyChanged += OnProxyChanged; } public void OnConfigDisable() { _consumer.Deactivate(); } void OnProxyChanged(object sender, ProxyChangedEventArgs e) { _entries[e.Name].OnProxyChanged(e); } readonly List _recvsrcs = new List(); void Update() { if (m_inputDialog.activeSelf) { _consumer.EnumerateEvents(ev => { AddSourceItem(ev.Id.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