6e0eb32a24
Co-authored-by: Cursor <cursoragent@cursor.com>
148 lines
4.7 KiB
C#
148 lines
4.7 KiB
C#
using HSUI.Config.Attributes;
|
|
using Dalamud.Bindings.ImGui;
|
|
using System;
|
|
using System.IO;
|
|
using System.Numerics;
|
|
|
|
namespace HSUI.Config.Tree
|
|
{
|
|
public class SectionNode : Node
|
|
{
|
|
public bool Selected;
|
|
public string Name = null!;
|
|
public bool ForceAllowExport = false;
|
|
public string? ForceSelectedTabName = null;
|
|
|
|
public SectionNode() { }
|
|
|
|
protected override bool AllowExport()
|
|
{
|
|
if (ForceAllowExport) { return true; }
|
|
|
|
return base.AllowExport();
|
|
}
|
|
|
|
public bool Draw(ref bool changed, float alpha)
|
|
{
|
|
if (!Selected)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
bool didReset = false;
|
|
|
|
ImGui.NewLine();
|
|
|
|
if (ImGui.BeginChild(
|
|
"DelvU_Settings_Tab",
|
|
new Vector2(0, -10),
|
|
false,
|
|
ImGuiWindowFlags.NoScrollbar | ImGuiWindowFlags.NoScrollWithMouse
|
|
))
|
|
{
|
|
bool popColors = false;
|
|
if (ConfigurationManager.Instance.OverrideDalamudStyle)
|
|
{
|
|
ImGui.PushStyleColor(ImGuiCol.Tab, new Vector4(45f / 255f, 45f / 255f, 45f / 255f, alpha));
|
|
ImGui.PushStyleColor(ImGuiCol.Button, new Vector4(45f / 255f, 45f / 255f, 45f / 255f, alpha));
|
|
popColors = true;
|
|
}
|
|
|
|
if (ImGui.BeginTabBar("##Tabs", ImGuiTabBarFlags.None))
|
|
{
|
|
foreach (SubSectionNode subSectionNode in _children)
|
|
{
|
|
if (ForceSelectedTabName != null)
|
|
{
|
|
bool a = subSectionNode.Name == ForceSelectedTabName; // no idea how this works
|
|
ImGuiTabItemFlags flag = subSectionNode.Name == ForceSelectedTabName ? ImGuiTabItemFlags.SetSelected : ImGuiTabItemFlags.None;
|
|
|
|
if (!ImGui.BeginTabItem(subSectionNode.Name, ref a, flag))
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!ImGui.BeginTabItem(subSectionNode.Name))
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
|
|
DrawExportResetContextMenu(subSectionNode, Name + "_" + subSectionNode.Name + "_tab");
|
|
|
|
ImGui.BeginChild("subconfig value", new Vector2(0, 0), true);
|
|
didReset |= subSectionNode.Draw(ref changed);
|
|
ImGui.EndChild();
|
|
|
|
ImGui.EndTabItem();
|
|
}
|
|
|
|
ImGui.EndTabBar();
|
|
ForceSelectedTabName = null;
|
|
}
|
|
|
|
if (popColors)
|
|
{
|
|
ImGui.PopStyleColor(2);
|
|
}
|
|
|
|
didReset |= DrawResetModal();
|
|
}
|
|
|
|
ImGui.EndChild();
|
|
|
|
return didReset;
|
|
}
|
|
|
|
public override void Save(string path)
|
|
{
|
|
foreach (SubSectionNode child in _children)
|
|
{
|
|
child.Save(Path.Combine(path, Name));
|
|
}
|
|
}
|
|
|
|
public override void Load(string path)
|
|
{
|
|
foreach (SubSectionNode child in _children)
|
|
{
|
|
child.Load(Path.Combine(path, Name));
|
|
}
|
|
}
|
|
|
|
public ConfigPageNode? GetOrAddConfig<T>() where T : PluginConfigObject
|
|
{
|
|
object[] attributes = typeof(T).GetCustomAttributes(true);
|
|
|
|
foreach (object attribute in attributes)
|
|
{
|
|
if (attribute is SubSectionAttribute subSectionAttribute)
|
|
{
|
|
foreach (SubSectionNode subSectionNode in _children)
|
|
{
|
|
if (subSectionNode.Name == subSectionAttribute.SubSectionName)
|
|
{
|
|
return subSectionNode.GetOrAddConfig<T>();
|
|
}
|
|
}
|
|
|
|
if (subSectionAttribute.Depth == 0)
|
|
{
|
|
NestedSubSectionNode newNode = new();
|
|
newNode.Name = subSectionAttribute.SubSectionName;
|
|
newNode.Depth = 0;
|
|
_children.Add(newNode);
|
|
|
|
return newNode.GetOrAddConfig<T>();
|
|
}
|
|
}
|
|
}
|
|
|
|
Type type = typeof(T);
|
|
throw new ArgumentException("The provided configuration object does not specify a sub-section: " + type.Name);
|
|
}
|
|
}
|
|
}
|