v1.0.6.0: Tooltip icons for action bars, status effects, party cooldowns; World Object Tooltip quest/NPC icons
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+52
-11
@@ -6,6 +6,7 @@ using HSUI.Config;
|
||||
using HSUI.Config.Attributes;
|
||||
using HSUI.Interface.GeneralElements;
|
||||
using Dalamud.Bindings.ImGui;
|
||||
using FFXIVClientStructs.FFXIV.Client.Game.Object;
|
||||
using System;
|
||||
using System.Numerics;
|
||||
using System.Text;
|
||||
@@ -55,18 +56,21 @@ namespace HSUI.Helpers
|
||||
private string? _currentTooltipTitle = null;
|
||||
private Vector2 _titleSize;
|
||||
private string? _previousRawText = null;
|
||||
private uint? _currentIconId = null;
|
||||
|
||||
private Vector2 _position;
|
||||
private Vector2 _size;
|
||||
|
||||
private bool _dataIsValid = false;
|
||||
|
||||
public void ShowTooltipOnCursor(string text, string? title = null, uint id = 0, string name = "")
|
||||
private const float IconSize = 24f;
|
||||
|
||||
public void ShowTooltipOnCursor(string text, string? title = null, uint id = 0, string name = "", uint? iconId = null)
|
||||
{
|
||||
ShowTooltip(text, ImGui.GetMousePos(), title, id, name);
|
||||
ShowTooltip(text, ImGui.GetMousePos(), title, id, name, iconId);
|
||||
}
|
||||
|
||||
public void ShowTooltip(string text, Vector2 position, string? title = null, uint id = 0, string name = "")
|
||||
public void ShowTooltip(string text, Vector2 position, string? title = null, uint id = 0, string name = "", uint? iconId = null)
|
||||
{
|
||||
if (text == null)
|
||||
{
|
||||
@@ -82,6 +86,8 @@ namespace HSUI.Helpers
|
||||
_previousRawText = text;
|
||||
}
|
||||
|
||||
_currentIconId = iconId;
|
||||
|
||||
// calcualte title size
|
||||
_titleSize = Vector2.Zero;
|
||||
if (title != null)
|
||||
@@ -113,7 +119,13 @@ namespace HSUI.Helpers
|
||||
_textSize = ImGui.CalcTextSize(_currentTooltipText, false, MaxWidth);
|
||||
}
|
||||
|
||||
_size = new Vector2(Math.Max(_titleSize.X, _textSize.X) + Margin * 2, _titleSize.Y + _textSize.Y + Margin * 2);
|
||||
float contentWidth = Math.Max(_titleSize.X, _textSize.X);
|
||||
float contentHeight = _titleSize.Y + _textSize.Y;
|
||||
float iconSizeScaled = IconSize * ImGuiHelpers.GlobalScale * _config.TooltipScale;
|
||||
float iconGap = _currentIconId.HasValue && _currentIconId.Value > 0 ? iconSizeScaled + Margin : 0;
|
||||
_size = new Vector2(
|
||||
contentWidth + iconGap + Margin * 2,
|
||||
Math.Max(contentHeight, _currentIconId.HasValue && _currentIconId.Value > 0 ? iconSizeScaled : 0) + Margin * 2);
|
||||
|
||||
// position tooltip using the given coordinates as bottom center
|
||||
position.X = position.X - _size.X / 2f;
|
||||
@@ -220,16 +232,29 @@ namespace HSUI.Helpers
|
||||
if (string.IsNullOrEmpty(body))
|
||||
body = "(No info)";
|
||||
|
||||
uint? iconId = _worldTooltipConfig.ShowIcon ? GetWorldObjectIconId(mouseOverTarget) : null;
|
||||
|
||||
if (_worldTooltipConfig.DetachFromCursor)
|
||||
{
|
||||
ShowTooltip(body, _worldTooltipConfig.Position, name);
|
||||
ShowTooltip(body, _worldTooltipConfig.Position, name, 0, "", iconId);
|
||||
}
|
||||
else
|
||||
{
|
||||
ShowTooltipOnCursor(body, name);
|
||||
ShowTooltipOnCursor(body, name, 0, "", iconId);
|
||||
}
|
||||
}
|
||||
|
||||
private static unsafe uint? GetWorldObjectIconId(IGameObject gameObject)
|
||||
{
|
||||
if (gameObject == null || gameObject.Address == IntPtr.Zero)
|
||||
return null;
|
||||
var obj = (GameObject*)gameObject.Address;
|
||||
if (obj == null)
|
||||
return null;
|
||||
uint iconId = obj->NamePlateIconId;
|
||||
return iconId > 0 ? iconId : null;
|
||||
}
|
||||
|
||||
public void RemoveTooltip()
|
||||
{
|
||||
_dataIsValid = false;
|
||||
@@ -279,14 +304,26 @@ namespace HSUI.Helpers
|
||||
float globalScaleCorrection = -15 + 15 * ImGuiHelpers.GlobalScale;
|
||||
|
||||
string fontId = _config.FontID ?? FontsConfig.DefaultSmallFontKey;
|
||||
float wrapWidth = Math.Max(_titleSize.X, _textSize.X) + Margin;
|
||||
float iconSizeScaled = IconSize * ImGuiHelpers.GlobalScale * _config.TooltipScale;
|
||||
float iconGap = (_currentIconId.HasValue && _currentIconId.Value > 0) ? iconSizeScaled + Margin : 0;
|
||||
float wrapWidth = (_currentIconId.HasValue && _currentIconId.Value > 0)
|
||||
? _size.X - iconGap - Margin * 2
|
||||
: Math.Max(_titleSize.X, _textSize.X) + Margin;
|
||||
float textBlockX = windowMargin.X + Margin + iconGap;
|
||||
|
||||
if (_currentIconId.HasValue && _currentIconId.Value > 0)
|
||||
{
|
||||
var iconPos = _position + new Vector2(Margin, Margin);
|
||||
DrawHelper.DrawIcon(_currentIconId.Value, iconPos, new Vector2(iconSizeScaled, iconSizeScaled), false, drawList);
|
||||
}
|
||||
|
||||
if (_currentTooltipTitle != null)
|
||||
{
|
||||
// title
|
||||
Vector2 cursorPos;
|
||||
using (FontsManager.Instance.PushFont(fontId))
|
||||
{
|
||||
cursorPos = new Vector2(windowMargin.X + _size.X / 2f - _titleSize.X / 2f, Margin);
|
||||
cursorPos = new Vector2(textBlockX, Margin);
|
||||
ImGui.SetCursorPos(cursorPos);
|
||||
ImGui.PushTextWrapPos(cursorPos.X + wrapWidth + globalScaleCorrection);
|
||||
ImGui.TextColored(_config.TitleColor.Vector, _currentTooltipTitle);
|
||||
@@ -296,7 +333,7 @@ namespace HSUI.Helpers
|
||||
// text
|
||||
using (FontsManager.Instance.PushFont(fontId))
|
||||
{
|
||||
cursorPos = new Vector2(windowMargin.X + _size.X / 2f - _textSize.X / 2f, Margin + _titleSize.Y);
|
||||
cursorPos = new Vector2(textBlockX, Margin + _titleSize.Y);
|
||||
ImGui.SetCursorPos(cursorPos);
|
||||
ImGui.PushTextWrapPos(cursorPos.X + wrapWidth + globalScaleCorrection);
|
||||
ImGui.TextColored(_config.TextColor.Vector, _currentTooltipText);
|
||||
@@ -308,8 +345,8 @@ namespace HSUI.Helpers
|
||||
// text
|
||||
using (FontsManager.Instance.PushFont(fontId))
|
||||
{
|
||||
var cursorPos = windowMargin + new Vector2(Margin, Margin);
|
||||
var textWidth = _size.X - Margin * 2;
|
||||
var cursorPos = new Vector2(textBlockX, Margin);
|
||||
var textWidth = _size.X - iconGap - Margin * 2;
|
||||
|
||||
ImGui.SetCursorPos(cursorPos);
|
||||
ImGui.PushTextWrapPos(cursorPos.X + textWidth + globalScaleCorrection);
|
||||
@@ -426,6 +463,10 @@ namespace HSUI.Helpers
|
||||
[Order(2, collapseWith = nameof(DetachFromCursor))]
|
||||
public Vector2 Position = new Vector2(100, 100);
|
||||
|
||||
[Checkbox("Show Icon (quest/NPC icons)", spacing = true)]
|
||||
[Order(3)]
|
||||
public bool ShowIcon = true;
|
||||
|
||||
[Checkbox("Show Level", spacing = true)]
|
||||
[Order(5)]
|
||||
public bool ShowLevel = true;
|
||||
|
||||
Reference in New Issue
Block a user