f37369cdda
Co-authored-by: Cursor <cursoragent@cursor.com>
211 lines
7.2 KiB
C#
211 lines
7.2 KiB
C#
using Dalamud.Game.ClientState.Objects.Types;
|
|
using HSUI.Config;
|
|
using HSUI.Enums;
|
|
using HSUI.Helpers;
|
|
using HSUI.Interface.GeneralElements;
|
|
using Dalamud.Bindings.ImGui;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Numerics;
|
|
|
|
namespace HSUI.Interface.Bars
|
|
{
|
|
public class BarHud
|
|
{
|
|
private string ID { get; set; }
|
|
|
|
private Rect BackgroundRect { get; set; } = new Rect();
|
|
|
|
private List<Rect> ForegroundRects { get; set; } = new List<Rect>();
|
|
|
|
private List<LabelHud> LabelHuds { get; set; } = new List<LabelHud>();
|
|
|
|
private bool DrawBorder { get; set; }
|
|
|
|
private PluginConfigColor? BorderColor { get; set; }
|
|
|
|
private int BorderThickness { get; set; }
|
|
|
|
private DrawAnchor Anchor { get; set; }
|
|
|
|
private IGameObject? Actor { get; set; }
|
|
|
|
private PluginConfigColor? GlowColor { get; set; }
|
|
|
|
private int GlowSize { get; set; }
|
|
|
|
private float? Current;
|
|
private float? Max;
|
|
|
|
private ShadowConfig? ShadowConfig { get; set; }
|
|
|
|
private string? BarTextureName { get; set; }
|
|
private BarTextureDrawMode BarTextureDrawMode { get; set; }
|
|
|
|
public bool NeedsInputs = false;
|
|
|
|
public BarHud(
|
|
string id,
|
|
bool drawBorder = true,
|
|
PluginConfigColor? borderColor = null,
|
|
int borderThickness = 1,
|
|
DrawAnchor anchor = DrawAnchor.TopLeft,
|
|
IGameObject? actor = null,
|
|
PluginConfigColor? glowColor = null,
|
|
int? glowSize = 1,
|
|
float? current = null,
|
|
float? max = null,
|
|
ShadowConfig? shadowConfig = null,
|
|
string? barTextureName = null,
|
|
BarTextureDrawMode barTextureDrawMode = BarTextureDrawMode.Stretch)
|
|
{
|
|
ID = id;
|
|
DrawBorder = drawBorder;
|
|
BorderColor = borderColor;
|
|
BorderThickness = borderThickness;
|
|
Anchor = anchor;
|
|
Actor = actor;
|
|
GlowColor = glowColor;
|
|
GlowSize = glowSize ?? 1;
|
|
Current = current;
|
|
Max = max;
|
|
ShadowConfig = shadowConfig;
|
|
BarTextureName = barTextureName;
|
|
BarTextureDrawMode = barTextureDrawMode;
|
|
}
|
|
|
|
public BarHud(BarConfig config, IGameObject? actor = null, BarGlowConfig? glowConfig = null, float? current = null, float? max = null)
|
|
: this(config.ID,
|
|
config.DrawBorder,
|
|
config.BorderColor,
|
|
config.BorderThickness,
|
|
config.Anchor,
|
|
actor,
|
|
glowConfig?.Color,
|
|
glowConfig?.Size,
|
|
current,
|
|
max,
|
|
null,
|
|
config.BarTextureName,
|
|
config.BarTextureDrawMode)
|
|
{
|
|
BackgroundRect = new Rect(config.Position, config.Size, config.BackgroundColor);
|
|
ShadowConfig = config.ShadowConfig;
|
|
}
|
|
|
|
public BarHud SetBackground(Rect rect)
|
|
{
|
|
BackgroundRect = rect;
|
|
return this;
|
|
}
|
|
|
|
public BarHud AddForegrounds(params Rect[] rects)
|
|
{
|
|
ForegroundRects.AddRange(rects);
|
|
return this;
|
|
}
|
|
|
|
public BarHud AddLabels(params LabelConfig[]? labels)
|
|
{
|
|
if (labels != null)
|
|
{
|
|
foreach (LabelConfig config in labels)
|
|
{
|
|
var labelHud = new LabelHud(config);
|
|
LabelHuds.Add(labelHud);
|
|
}
|
|
}
|
|
|
|
return this;
|
|
}
|
|
|
|
public BarHud SetGlow(PluginConfigColor color, int size = 1)
|
|
{
|
|
GlowColor = color;
|
|
GlowSize = size;
|
|
|
|
return this;
|
|
}
|
|
|
|
public void Draw(Vector2 origin)
|
|
{
|
|
var barPos = Utils.GetAnchoredPosition(origin, BackgroundRect.Size, Anchor);
|
|
var backgroundPos = barPos + BackgroundRect.Position;
|
|
|
|
DrawRects(barPos, backgroundPos);
|
|
|
|
// labels
|
|
foreach (LabelHud label in LabelHuds)
|
|
{
|
|
label.Draw(backgroundPos, BackgroundRect.Size, Actor, null, (uint?)Current, (uint?)Max);
|
|
}
|
|
}
|
|
|
|
public List<(StrataLevel, Action)> GetDrawActions(Vector2 origin, StrataLevel strataLevel)
|
|
{
|
|
List<(StrataLevel, Action)> drawActions = new List<(StrataLevel, Action)>();
|
|
|
|
var barPos = Utils.GetAnchoredPosition(origin, BackgroundRect.Size, Anchor);
|
|
var backgroundPos = barPos + BackgroundRect.Position;
|
|
|
|
drawActions.Add((strataLevel, () =>
|
|
{
|
|
DrawRects(barPos, backgroundPos);
|
|
}
|
|
));
|
|
|
|
// labels
|
|
foreach (LabelHud label in LabelHuds)
|
|
{
|
|
drawActions.Add((label.GetConfig().StrataLevel, () =>
|
|
{
|
|
label.Draw(backgroundPos, BackgroundRect.Size, Actor, null, (uint?)Current, (uint?)Max);
|
|
}
|
|
));
|
|
}
|
|
|
|
return drawActions;
|
|
}
|
|
|
|
private void DrawRects(Vector2 barPos, Vector2 backgroundPos)
|
|
{
|
|
DrawHelper.DrawInWindow(ID, backgroundPos, BackgroundRect.Size, NeedsInputs, (drawList) =>
|
|
{
|
|
// Draw background
|
|
drawList.AddRectFilled(backgroundPos, backgroundPos + BackgroundRect.Size, BackgroundRect.Color.Base);
|
|
|
|
// Draw Shadow
|
|
if (ShadowConfig != null && ShadowConfig.Enabled)
|
|
{
|
|
// Right Side
|
|
drawList.AddRectFilled(backgroundPos + new Vector2(BackgroundRect.Size.X, ShadowConfig.Offset), backgroundPos + BackgroundRect.Size + new Vector2(ShadowConfig.Offset, ShadowConfig.Offset) + new Vector2(ShadowConfig.Thickness - 1, ShadowConfig.Thickness - 1), ShadowConfig.Color.Base);
|
|
|
|
// Bottom Size
|
|
drawList.AddRectFilled(backgroundPos + new Vector2(ShadowConfig.Offset, BackgroundRect.Size.Y), backgroundPos + BackgroundRect.Size + new Vector2(ShadowConfig.Offset, ShadowConfig.Offset) + new Vector2(ShadowConfig.Thickness - 1, ShadowConfig.Thickness - 1), ShadowConfig.Color.Base);
|
|
}
|
|
|
|
// Draw foregrounds
|
|
foreach (Rect rect in ForegroundRects)
|
|
{
|
|
DrawHelper.DrawBarTexture(barPos + rect.Position, rect.Size, rect.Color, BarTextureName, BarTextureDrawMode, drawList);
|
|
}
|
|
|
|
// Draw Border
|
|
if (DrawBorder)
|
|
{
|
|
drawList.AddRect(backgroundPos, backgroundPos + BackgroundRect.Size, BorderColor?.Base ?? 0xFF000000, 0, ImDrawFlags.None, BorderThickness);
|
|
}
|
|
|
|
// Draw Glow
|
|
if (GlowColor != null)
|
|
{
|
|
var glowPosition = new Vector2(backgroundPos.X - 1, backgroundPos.Y - 1);
|
|
var glowSize = new Vector2(BackgroundRect.Size.X + 2, BackgroundRect.Size.Y + 2);
|
|
|
|
drawList.AddRect(glowPosition, glowPosition + glowSize, GlowColor.Base, 0, ImDrawFlags.None, GlowSize);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|