LiveSplit.TZA/LiveSplit.TZA/TzaControl.cs

118 lines
3.6 KiB
C#
Executable File

using System.Windows.Forms;
using System.Xml;
using LiveSplit.TZA.Splits;
namespace LiveSplit.TZA;
public partial class TzaControl : UserControl {
internal Dictionary<uint, int> EnabledSplits { get; } = new();
private Dictionary<uint, TreeNode> 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;
}
}