- Check all tooltips for clipping

This commit is contained in:
Infi
2025-03-15 14:00:26 +01:00
parent 14cb3af13a
commit a6b71f50e6
5 changed files with 74 additions and 26 deletions
+3 -3
View File
@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<Version>1.29.19</Version> <Version>1.29.20</Version>
<TargetFramework>net8.0-windows</TargetFramework> <TargetFramework>net8.0-windows</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
@@ -54,10 +54,10 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="DalamudPackager" Version="11.0.0" /> <PackageReference Include="DalamudPackager" Version="11.0.0" />
<PackageReference Include="MessagePack" Version="3.0.238-rc.1" /> <PackageReference Include="MessagePack" Version="3.1.3" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.0" /> <PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.0" />
<PackageReference Include="Pidgin" Version="3.3.0" /> <PackageReference Include="Pidgin" Version="3.3.0" />
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.5" /> <PackageReference Include="SixLabors.ImageSharp" Version="3.1.7" />
<PackageReference Include="Watson.Lite" Version="6.2.3" /> <PackageReference Include="Watson.Lite" Version="6.2.3" />
</ItemGroup> </ItemGroup>
+15 -9
View File
@@ -259,9 +259,6 @@ public sealed class PayloadHandler
public unsafe void MoveTooltip(AddonEvent type, AddonArgs args) public unsafe void MoveTooltip(AddonEvent type, AddonArgs args)
{ {
if (!HandleTooltips)
return;
// Only move if user has "Next to Cursor" option selected // Only move if user has "Next to Cursor" option selected
if (!Plugin.GameConfig.TryGet(UiControlOption.DetailTrackingType, out uint selected) || selected != 0) if (!Plugin.GameConfig.TryGet(UiControlOption.DetailTrackingType, out uint selected) || selected != 0)
return; return;
@@ -273,16 +270,25 @@ public sealed class PayloadHandler
if (atk->WindowNode == null) if (atk->WindowNode == null)
return; return;
if (!atk->IsVisible)
return;
var component = atk->WindowNode->AtkResNode; var component = atk->WindowNode->AtkResNode;
var atkPos = new Vector2(component.ScreenX, component.ScreenY);
var atkSize = new Vector2(component.GetWidth() * component.ScaleX, component.GetHeight() * component.GetScaleY());
var chatRect = MathUtil.Rectangle.FromPosAndSize(LogWindow.LastWindowPos, LogWindow.LastWindowSize);
var addonRect = MathUtil.Rectangle.FromPosAndSize(atkPos, atkSize);
if (!MathUtil.CheckRectOverlap(chatRect, addonRect))
return;
var atkSize = (X: component.GetWidth() * component.ScaleX, Y: component.GetHeight() * component.GetScaleY());
var viewportSize = ImGuiHelpers.MainViewport.Size; var viewportSize = ImGuiHelpers.MainViewport.Size;
var window = LogWindow.LastWindowPos + LogWindow.LastWindowSize; var isLeft = chatRect.SizeX < viewportSize.X / 2;
var isLeft = window.X < viewportSize.X / 2; var isTop = chatRect.SizeY < viewportSize.Y / 2;
var isTop = window.Y < viewportSize.Y / 2;
var x = isLeft ? window.X : LogWindow.LastWindowPos.X - atkSize.X; var x = isLeft ? chatRect.SizeX : LogWindow.LastWindowPos.X - atkSize.X;
var y = Math.Clamp(window.Y - atkSize.Y, 0, float.MaxValue); var y = Math.Clamp(chatRect.SizeY - atkSize.Y, 0, float.MaxValue);
y -= isTop ? 0 : Plugin.Config.TooltipOffset; // offset to prevent cut-off on the bottom y -= isTop ? 0 : Plugin.Config.TooltipOffset; // offset to prevent cut-off on the bottom
atk->SetPosition((short) x, (short) y); atk->SetPosition((short) x, (short) y);
+4 -2
View File
@@ -102,12 +102,14 @@ public sealed class ChatLogWindow : Window
Plugin.ClientState.Login += Login; Plugin.ClientState.Login += Login;
Plugin.ClientState.Logout += Logout; Plugin.ClientState.Logout += Logout;
Plugin.AddonLifecycle.RegisterListener(AddonEvent.PostRequestedUpdate, "ItemDetail", PayloadHandler.MoveTooltip); Plugin.AddonLifecycle.RegisterListener(AddonEvent.PostUpdate, "ItemDetail", PayloadHandler.MoveTooltip);
Plugin.AddonLifecycle.RegisterListener(AddonEvent.PostUpdate, "ActionDetail", PayloadHandler.MoveTooltip);
} }
public void Dispose() public void Dispose()
{ {
Plugin.AddonLifecycle.UnregisterListener(AddonEvent.PostRequestedUpdate, "ItemDetail", PayloadHandler.MoveTooltip); Plugin.AddonLifecycle.UnregisterListener(AddonEvent.PostUpdate, "ItemDetail", PayloadHandler.MoveTooltip);
Plugin.AddonLifecycle.UnregisterListener(AddonEvent.PostUpdate, "ActionDetail", PayloadHandler.MoveTooltip);
Plugin.ClientState.Logout -= Logout; Plugin.ClientState.Logout -= Logout;
Plugin.ClientState.Login -= Login; Plugin.ClientState.Login -= Login;
Plugin.Commands.Register("/chat2").Execute -= ToggleChat; Plugin.Commands.Register("/chat2").Execute -= ToggleChat;
+40
View File
@@ -0,0 +1,40 @@
using System.Numerics;
namespace ChatTwo.Util;
public static class MathUtil
{
public struct Rectangle
{
public int X;
public int Y;
public int Width;
public int Height;
public static Rectangle FromPosAndSize(Vector2 pos, Vector2 size)
{
return new Rectangle
{
X = (int) pos.X,
Y = (int) pos.Y,
Width = (int) size.X,
Height = (int) size.Y
};
}
public int SizeX => X + Width;
public int SizeY => Y + Height;
}
// From: https://stackoverflow.com/a/306379
public static bool CheckRectOverlap(Rectangle a, Rectangle b)
{
bool ValueInRange(int value, int min, int max)
=> value > min && value < max;
var xOverlap = ValueInRange(a.X, b.X, b.X + b.Width) || ValueInRange(b.X, a.X, a.X + a.Width);
var yOverlap = ValueInRange(a.Y, b.Y, b.Y + b.Height) || ValueInRange(b.Y, a.Y, a.Y + a.Height);
return xOverlap && yOverlap;
}
}
+12 -12
View File
@@ -10,12 +10,12 @@
}, },
"MessagePack": { "MessagePack": {
"type": "Direct", "type": "Direct",
"requested": "[3.0.238-rc.1, )", "requested": "[3.1.3, )",
"resolved": "3.0.238-rc.1", "resolved": "3.1.3",
"contentHash": "gAVmHb2gswXviGFpAmUgGBVvZEjYGph7Co5hp6IbshEooIuZT34Rv4YcBKvVnUCHdoqxQvK6DZIOPSLSYv3LjQ==", "contentHash": "UiNv3fknvPzh5W+S0VV96R17RBZQQU71qgmsMnjjRZU2rtQM/XcTnOB+klT2dA6T1mxjnNKYrEm164AoXvGmYg==",
"dependencies": { "dependencies": {
"MessagePack.Annotations": "3.0.238-rc.1", "MessagePack.Annotations": "3.1.3",
"MessagePackAnalyzer": "3.0.238-rc.1", "MessagePackAnalyzer": "3.1.3",
"Microsoft.NET.StringTools": "17.11.4" "Microsoft.NET.StringTools": "17.11.4"
} }
}, },
@@ -38,9 +38,9 @@
}, },
"SixLabors.ImageSharp": { "SixLabors.ImageSharp": {
"type": "Direct", "type": "Direct",
"requested": "[3.1.5, )", "requested": "[3.1.7, )",
"resolved": "3.1.5", "resolved": "3.1.7",
"contentHash": "lNtlq7dSI/QEbYey+A0xn48z5w4XHSffF8222cC4F4YwTXfEImuiBavQcWjr49LThT/pRmtWJRcqA/PlL+eJ6g==" "contentHash": "9fIOOAsyLFid6qKypM2Iy0Z3Q9yoanV8VoYAHtI2sYGMNKzhvRTjgFDHonIiVe+ANtxIxM6SuqUzj0r91nItpA=="
}, },
"Watson.Lite": { "Watson.Lite": {
"type": "Direct", "type": "Direct",
@@ -64,13 +64,13 @@
}, },
"MessagePack.Annotations": { "MessagePack.Annotations": {
"type": "Transitive", "type": "Transitive",
"resolved": "3.0.238-rc.1", "resolved": "3.1.3",
"contentHash": "yvnpKGuxZuFHnYZ9N8WQXQn0J28w2f0evh0RekDtuxIEKGPw/qQLQXyQWFzMunfb/+pKTWYlUZR1rvvNcwl10A==" "contentHash": "XTy4njgTAf6UVBKFj7c7ad5R0WVKbvAgkbYZy4f00kplzX2T3VOQ34AUke/Vn/QgQZ7ETdd34/IDWS3KBInSGA=="
}, },
"MessagePackAnalyzer": { "MessagePackAnalyzer": {
"type": "Transitive", "type": "Transitive",
"resolved": "3.0.238-rc.1", "resolved": "3.1.3",
"contentHash": "qweXSZ+3mrf3RAqBs71vrF20SiNmqQdbrrt/L3749jh7OPpvdyZcHhOd20BSk+THQXgmmQfqF5F3o/J7S7tGCQ==" "contentHash": "19u1oVNv2brCs5F/jma8O8CnsKMMpYwNqD0CAEDEzvqwDTAhqC9r7xHZP4stPb3APs/ryO/zVn7LvjoEHfvs7Q=="
}, },
"Microsoft.Data.Sqlite.Core": { "Microsoft.Data.Sqlite.Core": {
"type": "Transitive", "type": "Transitive",