Files
AetherBags/KamiToolKit/Nodes/Basic/NodeEditOverlayNode.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

154 lines
6.1 KiB
C#

using System.Numerics;
using Dalamud.Game.Addon.Events;
using FFXIVClientStructs.FFXIV.Component.GUI;
using KamiToolKit.Classes;
using KamiToolKit.Enums;
namespace KamiToolKit.Nodes;
internal unsafe class NodeEditOverlayNode : SimpleComponentNode {
private readonly NineGridNode backgroundNode;
private readonly ResizeNineGridNode bottomEditNode;
private readonly ResizeButtonNode leftCornerEditNode;
private readonly ResizeNineGridNode leftEditNode;
private readonly ResizeButtonNode rightCornerEditNode;
private readonly ResizeNineGridNode rightEditNode;
private readonly ResizeNineGridNode topEditNode;
public NodeEditOverlayNode() {
backgroundNode = new SimpleNineGridNode {
TexturePath = "ui/uld/HUDLayout.tex",
TextureSize = new Vector2(44.0f, 32.0f),
TextureCoordinates = new Vector2(0.0f, 0.0f),
TopOffset = 20,
BottomOffset = 8,
LeftOffset = 21,
RightOffset = 21,
Alpha = 0.75f,
};
backgroundNode.AttachNode(this);
rightEditNode = new ResizeNineGridNode();
rightEditNode.AttachNode(this);
bottomEditNode = new ResizeNineGridNode();
bottomEditNode.AttachNode(this);
leftEditNode = new ResizeNineGridNode();
leftEditNode.AttachNode(this);
topEditNode = new ResizeNineGridNode();
topEditNode.AttachNode(this);
rightCornerEditNode = new ResizeButtonNode(ResizeDirection.BottomRight);
rightCornerEditNode.AttachNode(this);
leftCornerEditNode = new ResizeButtonNode(ResizeDirection.BottomLeft);
leftCornerEditNode.AttachNode(this);
}
public bool ShowParts {
get;
set {
field = value;
rightEditNode.IsVisible = value;
bottomEditNode.IsVisible = value;
leftEditNode.IsVisible = value;
topEditNode.IsVisible = value;
rightCornerEditNode.IsVisible = value;
leftCornerEditNode.IsVisible = value;
}
}
protected override void OnSizeChanged() {
base.OnSizeChanged();
backgroundNode.Size = Size - new Vector2(24.0f, 24.0f);
backgroundNode.Position = new Vector2(12.0f, 12.0f);
const float lineThickness = 4.0f;
leftEditNode.Size = new Vector2(Height - 32.0f, lineThickness);
leftEditNode.Position = new Vector2(16.0f + leftEditNode.Height / 2.0f, 16.0f);
leftEditNode.RotationDegrees = 90.0f;
rightEditNode.Size = new Vector2(Height - 32.0f, lineThickness);
rightEditNode.Position = new Vector2(Width - 16.0f + rightEditNode.Height / 2.0f, 16.0f);
rightEditNode.RotationDegrees = 90.0f;
topEditNode.Size = new Vector2(Width - 32.0f, lineThickness);
topEditNode.Position = new Vector2(16.0f, 16.0f - lineThickness / 2.0f);
bottomEditNode.Size = new Vector2(Width - 32.0f, lineThickness);
bottomEditNode.Position = new Vector2(16.0f, Height - 16.0f - lineThickness / 2.0f);
leftCornerEditNode.Size = new Vector2(24.0f, 24.0f);
leftCornerEditNode.Position = new Vector2(16.0f - lineThickness / 4.0f, Height - 16.0f - leftCornerEditNode.Height);
rightCornerEditNode.Size = new Vector2(24.0f, 24.0f);
rightCornerEditNode.Position = new Vector2(Width - 16.0f - rightCornerEditNode.Width + lineThickness / 4.0f, Height - 16.0f - rightCornerEditNode.Height);
}
public Vector2 GetSizeDelta(Vector2 mouseDelta) {
if (leftEditNode.IsHovered) return new Vector2(-mouseDelta.X, 0.0f);
if (rightEditNode.IsHovered) return new Vector2(mouseDelta.X, 0.0f);
if (topEditNode.IsHovered) return new Vector2(0.0f, -mouseDelta.Y);
if (bottomEditNode.IsHovered) return new Vector2(0.0f, mouseDelta.Y);
if (rightCornerEditNode.IsHovered) return mouseDelta;
if (leftCornerEditNode.IsHovered) return new Vector2(-mouseDelta.X, mouseDelta.Y);
return Vector2.Zero;
}
public Vector2 GetPositionDelta(Vector2 mouseDelta) {
if (leftEditNode.IsHovered) return new Vector2(mouseDelta.X, 0.0f);
if (topEditNode.IsHovered) return new Vector2(0.0f, mouseDelta.Y);
if (leftCornerEditNode.IsHovered) return new Vector2(mouseDelta.X, 0.0f);
return Vector2.Zero;
}
public void UpdateHover(AtkEventData* eventData) {
rightEditNode.IsHovered = rightEditNode.CheckCollision(eventData);
bottomEditNode.IsHovered = bottomEditNode.CheckCollision(eventData);
leftEditNode.IsHovered = leftEditNode.CheckCollision(eventData);
topEditNode.IsHovered = topEditNode.CheckCollision(eventData);
rightCornerEditNode.IsHovered = rightCornerEditNode.CheckCollision(eventData);
leftCornerEditNode.IsHovered = leftCornerEditNode.CheckCollision(eventData);
if (rightCornerEditNode.IsHovered) {
bottomEditNode.IsHovered = false;
rightEditNode.IsHovered = false;
}
if (leftCornerEditNode.IsHovered) {
leftEditNode.IsHovered = false;
bottomEditNode.IsHovered = false;
}
}
public bool AnyHovered() {
if (rightEditNode.IsHovered) return true;
if (bottomEditNode.IsHovered) return true;
if (leftEditNode.IsHovered) return true;
if (topEditNode.IsHovered) return true;
if (rightCornerEditNode.IsHovered) return true;
if (leftCornerEditNode.IsHovered) return true;
return false;
}
public void SetCursor() {
if (rightEditNode.IsHovered) SetCursor(AddonCursorType.ResizeWE);
if (bottomEditNode.IsHovered) SetCursor(AddonCursorType.ResizeNS);
if (leftEditNode.IsHovered) SetCursor(AddonCursorType.ResizeWE);
if (topEditNode.IsHovered) SetCursor(AddonCursorType.ResizeNS);
if (rightCornerEditNode.IsHovered) SetCursor(AddonCursorType.ResizeNWSR);
if (leftCornerEditNode.IsHovered) SetCursor(AddonCursorType.ResizeNESW);
}
private static void SetCursor(AddonCursorType cursor)
=> DalamudInterface.Instance.AddonEventManager.SetCursor(cursor);
}