Files
AetherBags/KamiToolKit/Premade/Nodes/AlphaBarNode.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

118 lines
4.3 KiB
C#

using System;
using System.Numerics;
using Dalamud.Interface;
using FFXIVClientStructs.FFXIV.Component.GUI;
using KamiToolKit.Classes;
using KamiToolKit.Nodes;
namespace KamiToolKit.Premade.Nodes;
public unsafe class AlphaBarNode : SimpleComponentNode {
public readonly ImGuiImageNode AlphaBarBackgroundNode;
public readonly ImGuiImageNode AlphaBarGradientNode;
public readonly ImGuiImageNode AlphaBarSelectorNode;
private readonly ViewportEventListener alphaEventListener;
private bool isAlphaDragging;
public AlphaBarNode() {
alphaEventListener = new ViewportEventListener(AlphaSliderEvent);
AlphaBarBackgroundNode = new AlphaImageNode();
AlphaBarBackgroundNode.AttachNode(this);
AlphaBarGradientNode = new ImGuiImageNode {
TexturePath = DalamudInterface.Instance.GetAssetPath("VerticalGradient_WhiteToAlpha.png"),
FitTexture = true,
};
AlphaBarGradientNode.AttachNode(this);
AlphaBarGradientNode.AddEvent(AtkEventType.MouseDown, OnAlphaBarMouseDown);
AlphaBarSelectorNode = new ImGuiImageNode {
TexturePath = DalamudInterface.Instance.GetAssetPath("alpha_selector.png"),
FitTexture = true,
};
AlphaBarSelectorNode.AttachNode(this);
AlphaBarSelectorNode.AddEvent(AtkEventType.MouseDown, OnAlphaBarMouseDown);
}
protected override void Dispose(bool disposing, bool isNativeDestructor) {
if (disposing) {
base.Dispose(disposing, isNativeDestructor);
alphaEventListener.Dispose();
}
}
protected override void OnSizeChanged() {
base.OnSizeChanged();
AlphaBarBackgroundNode.Size = Size;
AlphaBarGradientNode.Size = Size;
AlphaBarSelectorNode.Size = new Vector2(Width + 4.0f, 10.0f);
AlphaBarSelectorNode.Position = new Vector2(-2.0f, 0.0f);
}
private void OnAlphaBarMouseDown() {
if (!isAlphaDragging) {
alphaEventListener.AddEvent(AtkEventType.MouseMove, AlphaBarGradientNode);
alphaEventListener.AddEvent(AtkEventType.MouseUp, AlphaBarGradientNode);
isAlphaDragging = true;
}
}
private void AlphaSliderEvent(AtkEventListener* thisPtr, AtkEventType eventType, int eventParam, AtkEvent* atkEvent, AtkEventData* atkEventData) {
switch (eventType) {
case AtkEventType.MouseUp:
alphaEventListener.RemoveEvent(AtkEventType.MouseMove);
alphaEventListener.RemoveEvent(AtkEventType.MouseUp);
isAlphaDragging = false;
break;
case AtkEventType.MouseMove: {
var mousePosition = new Vector2(atkEventData->MouseData.PosX, atkEventData->MouseData.PosY);
var scale = ParentAddon is not null ? ParentAddon->Scale : 1.0f;
var scaledHeight = AlphaBarGradientNode.Height * scale;
var minY = AlphaBarGradientNode.ScreenY;
var maxY = AlphaBarGradientNode.ScreenY + scaledHeight;
if (mousePosition.Y >= minY && mousePosition.Y <= maxY) {
var alphaRatio = 1.0f - (mousePosition.Y - AlphaBarGradientNode.ScreenY) / scaledHeight;
AlphaBarSelectorNode.Y = Height - Height * alphaRatio - 5.0f;
OnAlphaChanged?.Invoke(alphaRatio);
}
else if (mousePosition.Y < minY) {
AlphaBarSelectorNode.Y = -4.0f;
OnAlphaChanged?.Invoke(1.0f);
}
else if (mousePosition.Y > maxY) {
AlphaBarSelectorNode.Y = Height - 4.0f;
OnAlphaChanged?.Invoke(0.0f);
}
break;
}
}
}
public Action<float>? OnAlphaChanged { get; init; }
public override Vector4 Color {
get => AlphaBarGradientNode.Color;
set {
AlphaBarGradientNode.MultiplyColor = value.AsVector3();
AlphaBarSelectorNode.Y = Height - Height * value.W - 5.0f;
}
}
public override ColorHelpers.HsvaColor ColorHsva {
get => AlphaBarGradientNode.MultiplyColorHsva;
set {
AlphaBarGradientNode.MultiplyColorHsva = value with { A = 1.0f };
AlphaBarSelectorNode.Y = Height - Height * value.A - 5.0f;
}
}
}