using System.Windows.Forms; using System.Xml; using LiveSplit.TZA.Splits; namespace LiveSplit.TZA; public partial class TzaControl : UserControl { internal Dictionary EnabledSplits { get; } = new(); private Dictionary CheckBoxes { get; } = new(); private bool _updating; public TzaControl() { this.InitializeComponent(); this.SuspendLayout(); this.Dock = DockStyle.Fill; this.splitsPanel.AfterCheck += (_, args) => { if (this._updating) { return; } var isChecked = args.Node.Checked; if (args.Node.Tag is SplitInfo info) { // this is a parent node if (isChecked) { this.EnabledSplits[info.Id] = 0; } else { this.EnabledSplits.Remove(info.Id); } } else if (args.Node.Tag is int idx && args.Node.Parent.Tag is SplitInfo parentInfo) { // this is a child node if (isChecked) { this.EnabledSplits[parentInfo.Id] = idx; } else { this.EnabledSplits.Remove(parentInfo.Id); } } this.UpdateCheckboxState(); }; foreach (var info in SplitLogic.Splits) { var node = new TreeNode($"({info.Splits.Length}) {info.Name}") { Tag = info, Checked = this.EnabledSplits.ContainsKey(info.Id), }; for (var i = 0; i < info.Splits.Length; i++) { var split = info.Splits[i]; node.Nodes.Add(new TreeNode(split.GetHumanName()) { Tag = i, Checked = this.EnabledSplits.TryGetValue(info.Id, out var idx) && idx == i, }); } this.CheckBoxes[info.Id] = node; this.splitsPanel.Nodes.Add(node); } this.ResumeLayout(false); this.PerformLayout(); } internal XmlNode GetSettings(XmlDocument doc) { var node = doc.CreateElement("Settings"); var enabledSplits = doc.CreateElement("EnabledSplits"); foreach (var entry in this.EnabledSplits) { var elem = doc.CreateElement("Split"); elem.InnerText = (entry.Key * 1_000 + entry.Value).ToString(); enabledSplits.AppendChild(elem); } node.AppendChild(enabledSplits); return node; } internal void SetSettings(XmlNode node) { if (node is not XmlElement settings) { return; } this.EnabledSplits.Clear(); if (settings["EnabledSplits"] is { } enabledSplits) { foreach (var split in enabledSplits.ChildNodes) { if (split is not XmlElement splitElem) { continue; } if (uint.TryParse(splitElem.InnerText.Trim(), out var id)) { var idx = id % 1_000; this.EnabledSplits[id / 1_000] = (int) idx; } } } this.UpdateCheckboxState(); } private void UpdateCheckboxState() { this._updating = true; foreach (var entry in this.CheckBoxes) { entry.Value.Checked = this.EnabledSplits.ContainsKey(entry.Key); foreach (var node in entry.Value.Nodes) { if (node is TreeNode child) { child.Checked = this.EnabledSplits.TryGetValue(entry.Key, out var idx) && idx == (int) child.Tag; } } } this._updating = false; } }