118 lines
3.6 KiB
C#
Executable File
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;
|
|
}
|
|
}
|