Files
AetherBags/KamiToolKit/Nodes/Component/WindowNode.cs
T
KnackAtNite 8db4ce6094
Debug Build and Test / Build against Latest Dalamud (push) Has been cancelled
Debug Build and Test / Build against Staging Dalamud (push) Has been cancelled
Initial commit: AetherBags + KamiToolKit for FC Gitea
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-08 14:46:31 -05:00

266 lines
9.6 KiB
C#

using System.Numerics;
using FFXIVClientStructs.FFXIV.Component.GUI;
using KamiToolKit.Classes;
using KamiToolKit.Enums;
using KamiToolKit.Timelines;
using Lumina.Text.ReadOnly;
namespace KamiToolKit.Nodes;
public unsafe class WindowNode : WindowNodeBase {
public readonly ImageNode BackgroundImageNode;
public readonly WindowBackgroundNode BackgroundNode;
public readonly WindowBackgroundNode BorderNode;
public readonly TextureButtonNode CloseButtonNode;
public readonly TextureButtonNode ConfigurationButtonNode;
public readonly SimpleNineGridNode DividingLineNode;
public readonly CollisionNode HeaderCollisionNode;
public readonly ResNode HeaderContainerNode;
public readonly TextureButtonNode InformationButtonNode;
public readonly TextNode SubtitleNode;
public readonly TextNode TitleNode;
public WindowNode() {
CollisionNode.NodeId = 13;
Component->ShowFlags = 1;
HeaderCollisionNode = new CollisionNode {
Uses = 2,
NodeId = 12,
Height = 28.0f,
Position = new Vector2(8.0f, 8.0f),
NodeFlags = NodeFlags.Visible | NodeFlags.Enabled | NodeFlags.HasCollision | NodeFlags.RespondToMouse | NodeFlags.EmitsEvents | NodeFlags.Focusable,
};
HeaderCollisionNode.AttachNode(this);
BackgroundNode = new WindowBackgroundNode(false) {
NodeId = 11,
Position = Vector2.Zero,
Offsets = new Vector4(64.0f, 32.0f, 32.0f, 32.0f),
NodeFlags = NodeFlags.Visible | NodeFlags.Enabled | NodeFlags.Fill | NodeFlags.EmitsEvents,
PartsRenderType = 19,
};
BackgroundNode.AttachNode(this);
BorderNode = new WindowBackgroundNode(true) {
NodeId = 10,
Position = Vector2.Zero,
Offsets = new Vector4(64.0f, 32.0f, 32.0f, 32.0f),
NodeFlags = NodeFlags.Visible | NodeFlags.Enabled | NodeFlags.Fill | NodeFlags.EmitsEvents,
PartsRenderType = 7,
};
BorderNode.AttachNode(this);
BackgroundImageNode = new SimpleImageNode {
NodeId = 9,
WrapMode = WrapMode.Stretch,
NodeFlags = NodeFlags.Visible | NodeFlags.Enabled | NodeFlags.EmitsEvents,
TexturePath = "ui/uld/WindowA_Gradation.tex",
TextureCoordinates = new Vector2(6.0f, 2.0f),
TextureSize = new Vector2(24.0f, 24.0f),
};
BackgroundImageNode.AttachNode(this);
HeaderContainerNode = new ResNode {
NodeId = 2,
Size = new Vector2(477.0f, 38.0f),
};
HeaderContainerNode.AttachNode(this);
DividingLineNode = new SimpleNineGridNode {
NodeId = 8,
TexturePath = "ui/uld/WindowA_Line.tex",
TextureCoordinates = Vector2.Zero,
TextureSize = new Vector2(32.0f, 4.0f),
Size = new Vector2(650.0f, 4.0f),
LeftOffset = 12.0f,
RightOffset = 12.0f,
Position = new Vector2(10.0f, 33.0f),
};
DividingLineNode.AttachNode(HeaderContainerNode);
CloseButtonNode = new TextureButtonNode {
NodeId = 7,
Size = new Vector2(28.0f, 28.0f),
Position = new Vector2(449.0f, 6.0f),
NodeFlags = NodeFlags.Visible | NodeFlags.Enabled | NodeFlags.EmitsEvents,
TexturePath = "ui/uld/WindowA_Button.tex",
TextureCoordinates = new Vector2(0.0f, 0.0f),
TextureSize = new Vector2(28.0f, 28.0f),
};
CloseButtonNode.AttachNode(HeaderContainerNode);
ConfigurationButtonNode = new TextureButtonNode {
NodeId = 6,
Size = new Vector2(16.0f, 16.0f),
Position = new Vector2(435.0f, 8.0f),
NodeFlags = NodeFlags.Visible | NodeFlags.Enabled | NodeFlags.EmitsEvents,
TexturePath = "ui/uld/WindowA_Button.tex",
TextureCoordinates = new Vector2(44.0f, 0.0f),
TextureSize = new Vector2(16.0f, 16.0f),
};
ConfigurationButtonNode.AttachNode(HeaderContainerNode);
InformationButtonNode = new TextureButtonNode {
NodeId = 5,
Size = new Vector2(16.0f, 16.0f),
Position = new Vector2(421.0f, 8.0f),
NodeFlags = NodeFlags.Visible | NodeFlags.Enabled | NodeFlags.EmitsEvents,
TexturePath = "ui/uld/WindowA_Button.tex",
TextureCoordinates = new Vector2(28.0f, 0.0f),
TextureSize = new Vector2(16.0f, 16.0f),
};
InformationButtonNode.AttachNode(HeaderContainerNode);
SubtitleNode = new TextNode {
NodeId = 4,
LineSpacing = 12,
AlignmentType = AlignmentType.Left,
FontSize = 12,
FontType = FontType.Axis,
NodeFlags = NodeFlags.Visible | NodeFlags.Enabled | NodeFlags.EmitsEvents,
TextColor = ColorHelper.GetColor(3),
TextOutlineColor = ColorHelper.GetColor(6),
BackgroundColor = Vector4.Zero,
Size = new Vector2(46.0f, 20.0f),
Position = new Vector2(83.0f, 17.0f),
};
SubtitleNode.AttachNode(HeaderContainerNode);
TitleNode = new TextNode {
NodeId = 3,
LineSpacing = 23,
AlignmentType = AlignmentType.Left,
FontSize = 23,
FontType = FontType.TrumpGothic,
TextFlags = TextFlags.AutoAdjustNodeSize,
NodeFlags = NodeFlags.Visible | NodeFlags.Enabled | NodeFlags.EmitsEvents,
TextColor = ColorHelper.GetColor(2),
TextOutlineColor = ColorHelper.GetColor(7),
BackgroundColor = Vector4.Zero,
Size = new Vector2(86.0f, 31.0f),
Position = new Vector2(12.0f, 7.0f),
};
TitleNode.AttachNode(HeaderContainerNode);
Data->ShowCloseButton = 1;
Data->ShowConfigButton = 0;
Data->ShowHelpButton = 0;
Data->ShowHeader = 1;
Data->Nodes[0] = TitleNode.NodeId;
Data->Nodes[1] = SubtitleNode.NodeId;
Data->Nodes[2] = CloseButtonNode.NodeId;
Data->Nodes[3] = ConfigurationButtonNode.NodeId;
Data->Nodes[4] = InformationButtonNode.NodeId;
Data->Nodes[5] = 0;
Data->Nodes[6] = HeaderContainerNode.NodeId;
Data->Nodes[7] = 0;
NodeFlags = NodeFlags.Visible | NodeFlags.Enabled | NodeFlags.EmitsEvents;
LoadTimelines();
InitializeComponentEvents();
}
public AtkUnitBase* OwnerAddon {
get => Component->OwnerUnitBase;
set => Component->OwnerUnitBase = value;
}
public ReadOnlySeString Title {
get => TitleNode.String;
set {
TitleNode.String = value;
TitleNode.IsVisible = true;
}
}
public ReadOnlySeString Subtitle {
get => SubtitleNode.String;
set {
SubtitleNode.String = value;
SubtitleNode.IsVisible = true;
SubtitleNode.X = TitleNode.X + TitleNode.Width + 2.0f;
}
}
public override void SetTitle(string title, string? subtitle = null) {
base.SetTitle(title, subtitle);
SubtitleNode.Position = new Vector2(TitleNode.Bounds.Right + 4.0f, SubtitleNode.Y);
}
public bool ShowCloseButton {
get => CloseButtonNode.IsVisible;
set => CloseButtonNode.IsVisible = value;
}
public bool ShowConfigButton {
get => ConfigurationButtonNode.IsVisible;
set => ConfigurationButtonNode.IsVisible = value;
}
public bool ShowHelpButton {
get => InformationButtonNode.IsVisible;
set => InformationButtonNode.IsVisible = value;
}
public bool ShowHeader {
get => InformationButtonNode.IsVisible;
set => InformationButtonNode.IsVisible = value;
}
public bool Focused {
get => BorderNode.IsVisible;
set => BorderNode.IsVisible = value;
}
public override float HeaderHeight => HeaderContainerNode.Height;
public override Vector2 ContentSize => new(BackgroundImageNode.Width, BackgroundImageNode.Height - HeaderHeight);
public override Vector2 ContentStartPosition => new(BackgroundImageNode.X, BackgroundImageNode.Y + HeaderHeight);
public override ResNode WindowHeaderFocusNode => HeaderContainerNode;
protected override void OnSizeChanged() {
base.OnSizeChanged();
HeaderContainerNode.Width = Width;
HeaderCollisionNode.Width = Width - 14.0f;
BackgroundNode.Size = Size;
BorderNode.Size = Size;
BackgroundImageNode.Size = new Vector2(Width - 8.0f, Height - 16.0f);
BackgroundImageNode.Position = new Vector2(4.0f, 4.0f);
CloseButtonNode.X = Width - 33.0f;
ConfigurationButtonNode.X = Width - 47.0f;
InformationButtonNode.X = Width - 61.0f;
DividingLineNode.Width = Width - 20.0f;
}
private void LoadTimelines() {
AddTimeline(new TimelineBuilder()
.BeginFrameSet(1, 29)
.AddLabelPair(1, 9, 17)
.AddLabelPair(10, 19, 18)
.AddLabelPair(20, 29, 7)
.EndFrameSet()
.Build());
BackgroundNode.AddTimeline(new TimelineBuilder()
.AddFrameSetWithFrame(1, 9, 1, multiplyColor: new Vector3(100.0f))
.AddFrameSetWithFrame(10, 19, 10, multiplyColor: new Vector3(100.0f))
.AddFrameSetWithFrame(20, 29, 20, multiplyColor: new Vector3(50.0f))
.Build());
BorderNode.AddTimeline(new TimelineBuilder()
.BeginFrameSet(10, 19)
.AddFrame(10, alpha: 0)
.AddFrame(12, alpha: 255)
.EndFrameSet()
.Build());
}
}