Initial commit: AetherBags + KamiToolKit for FC Gitea
Debug Build and Test / Build against Latest Dalamud (push) Has been cancelled
Debug Build and Test / Build against Staging Dalamud (push) Has been cancelled

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-02-08 14:46:31 -05:00
commit 8db4ce6094
375 changed files with 34124 additions and 0 deletions
@@ -0,0 +1,51 @@
using System.Numerics;
using FFXIVClientStructs.FFXIV.Component.GUI;
using FFXIVClientStructs.Interop;
using KamiToolKit.Classes;
using KamiToolKit.Nodes;
namespace KamiToolKit.Premade.ListItemNodes;
public unsafe class AddonListItemNode : ListItemNode<Pointer<AtkUnitBase>> {
public override float ItemHeight => 48.0f;
protected readonly IconImageNode IconNode;
protected readonly TextNode LabelTextNode;
public AddonListItemNode() {
IconNode = new IconImageNode {
FitTexture = true,
IconId = 60072,
};
IconNode.AttachNode(this);
LabelTextNode = new TextNode {
TextFlags = TextFlags.Ellipsis | TextFlags.Emboss,
FontSize = 14,
LineSpacing = 14,
AlignmentType = AlignmentType.Left,
TextColor = ColorHelper.GetColor(8),
TextOutlineColor = ColorHelper.GetColor(7),
};
LabelTextNode.AttachNode(this);
CollisionNode.ShowClickableCursor = true;
}
protected override void OnSizeChanged() {
base.OnSizeChanged();
IconNode.Size = new Vector2(Height - 4.0f, Height - 4.0f);
IconNode.Position = new Vector2(2.0f, 2.0f);
LabelTextNode.Size = new Vector2(Width - IconNode.Width - 6.0f, Height);
LabelTextNode.Position = new Vector2(IconNode.Bounds.Right + 6.0f, 0.0f);
}
protected override void SetNodeData(Pointer<AtkUnitBase> itemData) {
if (itemData.Value is null) return;
IconNode.IconId = itemData.Value->IsVisible ? (uint) 60071 : 60072;
LabelTextNode.String = itemData.Value->NameString;
}
}
@@ -0,0 +1,51 @@
using System.Numerics;
using FFXIVClientStructs.FFXIV.Component.GUI;
using KamiToolKit.Classes;
using KamiToolKit.Nodes;
using Lumina.Excel.Sheets;
namespace KamiToolKit.Premade.ListItemNodes;
public class CurrencyListItemNode : ListItemNode<Item> {
public override float ItemHeight => 48.0f;
protected readonly IconImageNode IconNode;
protected readonly TextNode LabelTextNode;
public CurrencyListItemNode() {
IconNode = new IconImageNode {
FitTexture = true,
IconId = 60072,
};
IconNode.AttachNode(this);
LabelTextNode = new TextNode {
TextFlags = TextFlags.Ellipsis | TextFlags.Emboss,
FontSize = 14,
LineSpacing = 14,
AlignmentType = AlignmentType.Left,
TextColor = ColorHelper.GetColor(8),
TextOutlineColor = ColorHelper.GetColor(7),
};
LabelTextNode.AttachNode(this);
CollisionNode.ShowClickableCursor = true;
}
protected override void OnSizeChanged() {
base.OnSizeChanged();
IconNode.Size = new Vector2(Height - 4.0f, Height - 4.0f);
IconNode.Position = new Vector2(2.0f, 2.0f);
LabelTextNode.Size = new Vector2(Width - IconNode.Width - 6.0f, Height);
LabelTextNode.Position = new Vector2(IconNode.Bounds.Right + 6.0f, 0.0f);
}
protected override void SetNodeData(Item itemData) {
if (itemData.RowId is 0) return;
IconNode.IconId = itemData.Icon;
LabelTextNode.String = itemData.Name.ToString();
}
}
@@ -0,0 +1,78 @@
using System.Numerics;
using FFXIVClientStructs.FFXIV.Component.GUI;
using KamiToolKit.Classes;
using KamiToolKit.Nodes;
using Lumina.Excel.Sheets;
namespace KamiToolKit.Premade.ListItemNodes;
public class ItemListItemNode : ListItemNode<Item> {
public override float ItemHeight => 32.0f;
protected readonly IconImageNode IconNode;
protected readonly TextNode LabelTextNode;
protected readonly TextNode SubLabelTextNode;
protected readonly TextNode IdTextNode;
public ItemListItemNode() {
IconNode = new IconImageNode {
FitTexture = true,
IconId = 60072,
};
IconNode.AttachNode(this);
LabelTextNode = new TextNode {
TextFlags = TextFlags.Ellipsis | TextFlags.Emboss,
FontSize = 14,
LineSpacing = 14,
AlignmentType = AlignmentType.BottomLeft,
TextColor = ColorHelper.GetColor(8),
TextOutlineColor = ColorHelper.GetColor(7),
};
LabelTextNode.AttachNode(this);
SubLabelTextNode = new TextNode {
TextFlags = TextFlags.Ellipsis | TextFlags.Emboss,
FontSize = 12,
LineSpacing = 12,
AlignmentType = AlignmentType.TopLeft,
TextColor = ColorHelper.GetColor(3),
TextOutlineColor = ColorHelper.GetColor(7),
};
SubLabelTextNode.AttachNode(this);
IdTextNode = new TextNode {
TextFlags = TextFlags.Emboss,
FontSize = 10,
AlignmentType = AlignmentType.BottomRight,
TextColor = ColorHelper.GetColor(3),
};
IdTextNode.AttachNode(this);
CollisionNode.ShowClickableCursor = true;
}
protected override void OnSizeChanged() {
base.OnSizeChanged();
IconNode.Size = new Vector2(Height - 4.0f, Height - 4.0f);
IconNode.Position = new Vector2(2.0f, 2.0f);
LabelTextNode.Size = new Vector2(Width - Height - 2.0f - 30.0f, Height / 2.0f);
LabelTextNode.Position = new Vector2(Height + 2.0f, 0.0f);
SubLabelTextNode.Size = new Vector2(Width - Height - 2.0f - 10.0f, Height / 2.0f);
SubLabelTextNode.Position = new Vector2(Height + 2.0f + 10.0f, Height / 2.0f);
IdTextNode.Size = new Vector2(30.0f, Height / 2.0f);
IdTextNode.Position = new Vector2(Width - 30.0f, 0.0f);
}
protected override void SetNodeData(Item itemData) {
if (itemData.RowId is 0) return;
IconNode.IconId = itemData.Icon;
LabelTextNode.String = itemData.Name.ToString();
SubLabelTextNode.String = itemData.ItemSearchCategory.ValueNullable?.Name.ToString() ?? string.Empty;
}
}
@@ -0,0 +1,47 @@
using System.Numerics;
using FFXIVClientStructs.FFXIV.Component.GUI;
using KamiToolKit.Classes;
using KamiToolKit.Nodes;
using Lumina.Excel.Sheets;
namespace KamiToolKit.Premade.ListItemNodes;
public class StatusListItemNode : ListItemNode<Status> {
public override float ItemHeight => 48.0f;
protected readonly IconImageNode IconImageNode;
protected readonly TextNode StatusLabelNode;
public StatusListItemNode() {
IconImageNode = new IconImageNode {
FitTexture = true,
IconId = 60072,
};
IconImageNode.AttachNode(this);
StatusLabelNode = new TextNode {
TextFlags = TextFlags.Ellipsis | TextFlags.Emboss,
FontSize = 14,
LineSpacing = 14,
AlignmentType = AlignmentType.Left,
TextColor = ColorHelper.GetColor(8),
TextOutlineColor = ColorHelper.GetColor(7),
};
StatusLabelNode.AttachNode(this);
}
protected override void OnSizeChanged() {
base.OnSizeChanged();
IconImageNode.Size = new Vector2((Height - 4.0f) * 0.75f , Height - 4.0f);
IconImageNode.Position = new Vector2(2.0f, 2.0f);
StatusLabelNode.Size = new Vector2(Width - IconImageNode.Width - 6.0f, Height);
StatusLabelNode.Position = new Vector2(IconImageNode.Bounds.Right + 6.0f, 0.0f);
}
protected override void SetNodeData(Status itemData) {
IconImageNode.IconId = itemData.Icon;
StatusLabelNode.String = itemData.Name;
}
}
@@ -0,0 +1,8 @@
using KamiToolKit.Premade.GenericListItemNodes;
namespace KamiToolKit.Premade.ListItemNodes;
public class StringListItemNode : GenericStringListItemNode<string> {
protected override void SetNodeData(string itemData)
=> StringNode.String = itemData;
}
@@ -0,0 +1,89 @@
using System.Numerics;
using FFXIVClientStructs.FFXIV.Component.GUI;
using KamiToolKit.Classes;
using KamiToolKit.Nodes;
using Lumina.Excel.Sheets;
namespace KamiToolKit.Premade.ListItemNodes;
public class TerritoryTypeListItemNode : ListItemNode<TerritoryType> {
public override float ItemHeight => 64.0f;
private readonly SimpleImageNode territoryImageNode;
private readonly SimpleImageNode placeholderImageNode;
private readonly TextNode territoryTitleNode;
private readonly TextNode territoryDescriptionNode;
private readonly TextNode territoryIdNode;
public TerritoryTypeListItemNode() {
territoryImageNode = new SimpleImageNode {
FitTexture = true,
IsVisible = false,
};
territoryImageNode.AttachNode(this);
placeholderImageNode = new IconImageNode {
FitTexture = true,
IconId = 60072,
};
placeholderImageNode.AttachNode(this);
territoryTitleNode = new TextNode {
TextFlags = TextFlags.Ellipsis,
AlignmentType = AlignmentType.BottomLeft,
String = "None Selected",
};
territoryTitleNode.AttachNode(this);
territoryDescriptionNode = new TextNode {
TextFlags = TextFlags.Ellipsis,
AlignmentType = AlignmentType.TopLeft,
TextColor = ColorHelper.GetColor(2),
};
territoryDescriptionNode.AttachNode(this);
territoryIdNode = new TextNode {
AlignmentType = AlignmentType.Right,
TextColor = ColorHelper.GetColor(3),
};
territoryIdNode.AttachNode(this);
}
protected override void OnSizeChanged() {
base.OnSizeChanged();
territoryImageNode.Size = new Vector2((Height - 4.0f) * 1.777f, Height - 4.0f);
territoryImageNode.Position = new Vector2(2.0f, 2.0f);
territoryIdNode.Size = new Vector2(30.0f, 30.0f);
territoryIdNode.Position = new Vector2(Width - territoryIdNode.Width, 0.0f);
placeholderImageNode.Size = new Vector2(Height - 4.0f, Height - 4.0f);
placeholderImageNode.Position = new Vector2(2.0f, 2.0f);
territoryTitleNode.Size = new Vector2(Width - territoryImageNode.Width - 10.0f - territoryIdNode.Width - 4.0f, Height / 2.0f);
territoryTitleNode.Position = new Vector2(territoryImageNode.Bounds.Right + 8.0f, 0.0f);
territoryDescriptionNode.Size = territoryTitleNode.Size;
territoryDescriptionNode.Position = new Vector2(territoryTitleNode.Bounds.Left, Height / 2.0f);
}
protected override void SetNodeData(TerritoryType territory) {
if (territory.RowId is 0) return;
territoryIdNode.String = territory.RowId.ToString();
if (territory.LoadingImage.ValueNullable?.FileName is { IsEmpty: false } filePath) {
territoryImageNode.LoadTexture($"ui/loadingimage/{filePath}_hr1.tex");
territoryImageNode.IsVisible = true;
}
else {
territoryImageNode.IsVisible = false;
}
placeholderImageNode.IsVisible = !territoryImageNode.IsVisible;
territoryTitleNode.String = territory.PlaceName.ValueNullable?.Name.ToString() ?? string.Empty;
territoryDescriptionNode.String = territory.ContentFinderCondition.RowId is 0 ? string.Empty : territory.ContentFinderCondition.Value.Name.ToString();
}
}