Bump Dalamud SDK 14.0.1 → 15.0.0 for FFXIV 7.5 API compatibility

- Update Dalamud.NET.Sdk version in csproj
- Regenerate packages.lock.json against SDK 15
- Migrate FFXIVClientStructs.FFXIV.Component.GUI.ValueType → AtkValueType
  (SynthesisValues.cs)
- Introduce local IEndObject interface in ImRaii2.cs (Dalamud's nested
  ImRaii.IEndObject was removed in SDK 15)
- Switch direct Dalamud ImRaii returns to typed disposables
  (ImRaii.TabItemDisposable, ImRaii.ColorDisposable)
- Replace `if (!panel)` / `if (plot)` with `.Success` checks for the
  local IEndObject helpers
- Fix ref-bool lifetime issue in Settings.TabItem by using the
  ImRaii.TabItem(label, flags) overload
This commit is contained in:
2026-05-26 19:35:42 +02:00
parent be349a29a4
commit 8d6b603963
8 changed files with 23 additions and 19 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Dalamud.NET.Sdk/14.0.1">
<Project Sdk="Dalamud.NET.Sdk/15.0.0">
<PropertyGroup>
<Authors>Asriel Camora</Authors>
<Version>2.9.1.1</Version>
+1 -1
View File
@@ -321,7 +321,7 @@ internal static class ImGuiUtils
using var fill = ImRaii2.PushColor(ImPlotCol.Fill, Vector4.One.WithAlpha(.5f));
using var plot = ImRaii2.Plot("##violin", size, ImPlotFlags.CanvasOnly | ImPlotFlags.NoInputs | ImPlotFlags.NoChild | ImPlotFlags.NoFrame);
if (plot)
if (plot.Success)
{
ImPlot.SetupAxes([], [], ImPlotAxisFlags.NoDecorations, ImPlotAxisFlags.NoDecorations | ImPlotAxisFlags.AutoFit);
ImPlot.SetupAxisLimits(ImAxis.X1, data.Min, data.Max, ImPlotCond.Always);
+13 -8
View File
@@ -6,9 +6,14 @@ using System.Numerics;
namespace Craftimizer.Plugin;
public interface IEndObject : IDisposable
{
bool Success { get; }
}
public static class ImRaii2
{
private struct EndUnconditionally(Action endAction, bool success) : ImRaii.IEndObject, IDisposable
private struct EndUnconditionally(Action endAction, bool success) : IEndObject
{
private Action EndAction { get; } = endAction;
@@ -26,7 +31,7 @@ public static class ImRaii2
}
}
private struct EndConditionally(Action endAction, bool success) : ImRaii.IEndObject, IDisposable
private struct EndConditionally(Action endAction, bool success) : IEndObject
{
public bool Success { get; } = success;
@@ -48,36 +53,36 @@ public static class ImRaii2
}
}
public static ImRaii.IEndObject GroupPanel(string name, float width, out float internalWidth)
public static IEndObject GroupPanel(string name, float width, out float internalWidth)
{
internalWidth = ImGuiUtils.BeginGroupPanel(name, width);
return new EndUnconditionally(ImGuiUtils.EndGroupPanel, true);
}
public static ImRaii.IEndObject Plot(string title_id, Vector2 size, ImPlotFlags flags)
public static IEndObject Plot(string title_id, Vector2 size, ImPlotFlags flags)
{
return new EndConditionally(new Action(ImPlot.EndPlot), ImPlot.BeginPlot(title_id, size, flags));
}
public static ImRaii.IEndObject PushStyle(ImPlotStyleVar idx, Vector2 val)
public static IEndObject PushStyle(ImPlotStyleVar idx, Vector2 val)
{
ImPlot.PushStyleVar(idx, val);
return new EndUnconditionally(ImPlot.PopStyleVar, true);
}
public static ImRaii.IEndObject PushStyle(ImPlotStyleVar idx, float val)
public static IEndObject PushStyle(ImPlotStyleVar idx, float val)
{
ImPlot.PushStyleVar(idx, val);
return new EndUnconditionally(ImPlot.PopStyleVar, true);
}
public static ImRaii.IEndObject PushColor(ImPlotCol idx, Vector4 col)
public static IEndObject PushColor(ImPlotCol idx, Vector4 col)
{
ImPlot.PushStyleColor(idx, col);
return new EndUnconditionally(ImPlot.PopStyleColor, true);
}
public static ImRaii.IEndObject TextWrapPos(float wrap_local_pos_x)
public static IEndObject TextWrapPos(float wrap_local_pos_x)
{
ImGui.PushTextWrapPos(wrap_local_pos_x);
return new EndUnconditionally(ImGui.PopTextWrapPos, true);
+1 -1
View File
@@ -45,7 +45,7 @@ internal static class DynamicBars
defaultSize);
});
private static ImRaii.Color? PushCollectableColor(this in BarData bar, float collectability, bool colorUnmetThreshold = true)
private static ImRaii.ColorDisposable? PushCollectableColor(this in BarData bar, float collectability, bool colorUnmetThreshold = true)
{
if (bar.Collectability is not { } collectabilities)
return null;
+1 -1
View File
@@ -4,7 +4,7 @@ using Dalamud.Memory;
using FFXIVClientStructs.FFXIV.Client.UI;
using FFXIVClientStructs.FFXIV.Component.GUI;
using System;
using ValueType = FFXIVClientStructs.FFXIV.Component.GUI.ValueType;
using ValueType = FFXIVClientStructs.FFXIV.Component.GUI.AtkValueType;
namespace Craftimizer.Utils;
+1 -1
View File
@@ -810,7 +810,7 @@ public sealed unsafe class RecipeNote : Window, IDisposable
};
using var panel = ImRaii2.GroupPanel(panelTitle, panelWidth, out _);
if (!panel)
if (!panel.Success)
return;
var stepsAvailWidthOffset = ImGui.GetContentRegionAvail().X - panelWidth;
+2 -3
View File
@@ -50,14 +50,13 @@ public sealed class Settings : Window, IDisposable
SelectedTab = label;
}
private ImRaii.IEndObject TabItem(string label)
private ImRaii.TabItemDisposable TabItem(string label)
{
var isSelected = string.Equals(SelectedTab, label, StringComparison.Ordinal);
if (isSelected)
{
SelectedTab = null;
var open = true;
return ImRaii.TabItem(label, ref open, ImGuiTabItemFlags.SetSelected);
return ImRaii.TabItem(label, ImGuiTabItemFlags.SetSelected);
}
return ImRaii.TabItem(label);
}
+3 -3
View File
@@ -4,9 +4,9 @@
"net10.0-windows7.0": {
"DalamudPackager": {
"type": "Direct",
"requested": "[14.0.1, )",
"resolved": "14.0.1",
"contentHash": "y0WWyUE6dhpGdolK3iKgwys05/nZaVf4ZPtIjpLhJBZvHxkkiE23zYRo7K7uqAgoK/QvK5cqF6l3VG5AbgC6KA=="
"requested": "[15.0.0, )",
"resolved": "15.0.0",
"contentHash": "411vwC8/X8Z/sQ2TI6v3SvOn66xFPeOjFn3Zn+h0d3Ox2t1kFm66AhDvmx/qcMwVrR+Hidxj0dadpQ2dgyXMBQ=="
},
"DotNet.ReproducibleBuilds": {
"type": "Direct",