mirror of
https://github.com/goatcorp/Dalamud.git
synced 2026-02-21 15:27:43 +01:00
Compare commits
No commits in common. "b11b769292c6134b012289fab70c3ce8a0fca96f" and "93b95fd8133df0a3ff76509ebaff408adc7d0fc1" have entirely different histories.
b11b769292
...
93b95fd813
7 changed files with 44 additions and 117 deletions
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
<PropertyGroup Label="Feature">
|
||||
<Description>XIV Launcher addon framework</Description>
|
||||
<DalamudVersion>13.0.0.8</DalamudVersion>
|
||||
<DalamudVersion>13.0.0.7</DalamudVersion>
|
||||
<AssemblyVersion>$(DalamudVersion)</AssemblyVersion>
|
||||
<Version>$(DalamudVersion)</Version>
|
||||
<FileVersion>$(DalamudVersion)</FileVersion>
|
||||
|
|
|
|||
|
|
@ -257,7 +257,7 @@ internal sealed unsafe class DtrBar : IInternalDisposableService, IDtrBar
|
|||
/// <param name="toRemove">The resources to remove.</param>
|
||||
internal void RemoveEntry(DtrBarEntry toRemove)
|
||||
{
|
||||
this.RemoveNode(toRemove);
|
||||
this.RemoveNode(toRemove.TextNode);
|
||||
|
||||
if (toRemove.Storage != null)
|
||||
{
|
||||
|
|
@ -378,12 +378,12 @@ internal sealed unsafe class DtrBar : IInternalDisposableService, IDtrBar
|
|||
|
||||
var isHide = !data.Shown || data.UserHidden;
|
||||
var node = data.TextNode;
|
||||
var nodeHidden = !node->IsVisible();
|
||||
var nodeHidden = !node->AtkResNode.IsVisible();
|
||||
|
||||
if (!isHide)
|
||||
{
|
||||
if (nodeHidden)
|
||||
node->ToggleVisibility(true);
|
||||
node->AtkResNode.ToggleVisibility(true);
|
||||
|
||||
if (data is { Added: true, Text: not null, TextNode: not null } && (data.Dirty || nodeHidden))
|
||||
{
|
||||
|
|
@ -397,27 +397,27 @@ internal sealed unsafe class DtrBar : IInternalDisposableService, IDtrBar
|
|||
|
||||
ushort w = 0, h = 0;
|
||||
node->GetTextDrawSize(&w, &h, node->NodeText.StringPtr);
|
||||
node->SetWidth(w);
|
||||
node->AtkResNode.SetWidth(w);
|
||||
}
|
||||
|
||||
var elementWidth = data.TextNode->Width + this.configuration.DtrSpacing;
|
||||
var elementWidth = data.TextNode->AtkResNode.Width + this.configuration.DtrSpacing;
|
||||
|
||||
if (this.configuration.DtrSwapDirection)
|
||||
{
|
||||
data.TextNode->SetPositionFloat(runningXPos + this.configuration.DtrSpacing, 2);
|
||||
data.TextNode->AtkResNode.SetPositionFloat(runningXPos + this.configuration.DtrSpacing, 2);
|
||||
runningXPos += elementWidth;
|
||||
}
|
||||
else
|
||||
{
|
||||
runningXPos -= elementWidth;
|
||||
data.TextNode->SetPositionFloat(runningXPos, 2);
|
||||
data.TextNode->AtkResNode.SetPositionFloat(runningXPos, 2);
|
||||
}
|
||||
}
|
||||
else if (!nodeHidden)
|
||||
{
|
||||
// If we want the node hidden, shift it up, to prevent collision conflicts
|
||||
node->SetYFloat(-collisionNode->Height * dtr->RootNode->ScaleX);
|
||||
node->ToggleVisibility(false);
|
||||
node->AtkResNode.SetYFloat(-collisionNode->Height * dtr->RootNode->ScaleX);
|
||||
node->AtkResNode.ToggleVisibility(false);
|
||||
}
|
||||
|
||||
data.Dirty = false;
|
||||
|
|
@ -516,8 +516,8 @@ internal sealed unsafe class DtrBar : IInternalDisposableService, IDtrBar
|
|||
|
||||
var node = data.TextNode = this.MakeNode(++this.runningNodeIds);
|
||||
|
||||
this.eventHandles.TryAdd(node->NodeId, new List<IAddonEventHandle>());
|
||||
this.eventHandles[node->NodeId].AddRange(new List<IAddonEventHandle>
|
||||
this.eventHandles.TryAdd(node->AtkResNode.NodeId, new List<IAddonEventHandle>());
|
||||
this.eventHandles[node->AtkResNode.NodeId].AddRange(new List<IAddonEventHandle>
|
||||
{
|
||||
this.uiEventManager.AddEvent(AddonEventManager.DalamudInternalKey, (nint)dtr, (nint)node, AddonEventType.MouseOver, this.DtrEventHandler),
|
||||
this.uiEventManager.AddEvent(AddonEventManager.DalamudInternalKey, (nint)dtr, (nint)node, AddonEventType.MouseOut, this.DtrEventHandler),
|
||||
|
|
@ -528,8 +528,8 @@ internal sealed unsafe class DtrBar : IInternalDisposableService, IDtrBar
|
|||
while (lastChild->PrevSiblingNode != null) lastChild = lastChild->PrevSiblingNode;
|
||||
Log.Debug($"Found last sibling: {(ulong)lastChild:X}");
|
||||
lastChild->PrevSiblingNode = (AtkResNode*)node;
|
||||
node->ParentNode = lastChild->ParentNode;
|
||||
node->NextSiblingNode = lastChild;
|
||||
node->AtkResNode.ParentNode = lastChild->ParentNode;
|
||||
node->AtkResNode.NextSiblingNode = lastChild;
|
||||
|
||||
dtr->RootNode->ChildCount = (ushort)(dtr->RootNode->ChildCount + 1);
|
||||
Log.Debug("Set last sibling of DTR and updated child count");
|
||||
|
|
@ -542,31 +542,22 @@ internal sealed unsafe class DtrBar : IInternalDisposableService, IDtrBar
|
|||
return true;
|
||||
}
|
||||
|
||||
private void RemoveNode(DtrBarEntry data)
|
||||
private void RemoveNode(AtkTextNode* node)
|
||||
{
|
||||
var dtr = this.GetDtr();
|
||||
var node = data.TextNode;
|
||||
if (dtr == null || dtr->RootNode == null || dtr->UldManager.NodeList == null || node == null) return;
|
||||
|
||||
if (this.eventHandles.TryGetValue(node->NodeId, out var eventHandles))
|
||||
{
|
||||
eventHandles.ForEach(handle => this.uiEventManager.RemoveEvent(AddonEventManager.DalamudInternalKey, handle));
|
||||
eventHandles.Clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Warning("Could not find AtkResNode with NodeId {nodeId} in eventHandles", node->NodeId);
|
||||
}
|
||||
this.eventHandles[node->AtkResNode.NodeId].ForEach(handle => this.uiEventManager.RemoveEvent(AddonEventManager.DalamudInternalKey, handle));
|
||||
this.eventHandles[node->AtkResNode.NodeId].Clear();
|
||||
|
||||
var tmpPrevNode = node->PrevSiblingNode;
|
||||
var tmpNextNode = node->NextSiblingNode;
|
||||
var tmpPrevNode = node->AtkResNode.PrevSiblingNode;
|
||||
var tmpNextNode = node->AtkResNode.NextSiblingNode;
|
||||
|
||||
// if (tmpNextNode != null)
|
||||
tmpNextNode->PrevSiblingNode = tmpPrevNode;
|
||||
if (tmpPrevNode != null)
|
||||
tmpPrevNode->NextSiblingNode = tmpNextNode;
|
||||
node->Destroy(true);
|
||||
data.TextNode = null;
|
||||
node->AtkResNode.Destroy(true);
|
||||
|
||||
dtr->RootNode->ChildCount = (ushort)(dtr->RootNode->ChildCount - 1);
|
||||
Log.Debug("Set last sibling of DTR and updated child count");
|
||||
|
|
@ -584,13 +575,13 @@ internal sealed unsafe class DtrBar : IInternalDisposableService, IDtrBar
|
|||
return null;
|
||||
}
|
||||
|
||||
newTextNode->NodeId = nodeId;
|
||||
newTextNode->Type = NodeType.Text;
|
||||
newTextNode->NodeFlags = NodeFlags.AnchorLeft | NodeFlags.AnchorTop | NodeFlags.Enabled | NodeFlags.RespondToMouse | NodeFlags.HasCollision | NodeFlags.EmitsEvents;
|
||||
newTextNode->DrawFlags = 12;
|
||||
newTextNode->SetWidth(22);
|
||||
newTextNode->SetHeight(22);
|
||||
newTextNode->SetPositionFloat(-200, 2);
|
||||
newTextNode->AtkResNode.NodeId = nodeId;
|
||||
newTextNode->AtkResNode.Type = NodeType.Text;
|
||||
newTextNode->AtkResNode.NodeFlags = NodeFlags.AnchorLeft | NodeFlags.AnchorTop | NodeFlags.Enabled | NodeFlags.RespondToMouse | NodeFlags.HasCollision | NodeFlags.EmitsEvents;
|
||||
newTextNode->AtkResNode.DrawFlags = 12;
|
||||
newTextNode->AtkResNode.SetWidth(22);
|
||||
newTextNode->AtkResNode.SetHeight(22);
|
||||
newTextNode->AtkResNode.SetPositionFloat(-200, 2);
|
||||
|
||||
newTextNode->LineSpacing = 12;
|
||||
newTextNode->AlignmentFontType = 5;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,4 @@
|
|||
using System.Numerics;
|
||||
|
||||
using Dalamud.Configuration.Internal;
|
||||
using Dalamud.Configuration.Internal;
|
||||
using Dalamud.Game.Addon.Events.EventDataTypes;
|
||||
using Dalamud.Game.Text.SeStringHandling;
|
||||
using Dalamud.Plugin.Internal.Types;
|
||||
|
|
@ -50,11 +48,6 @@ public interface IReadOnlyDtrBarEntry
|
|||
/// Gets an action to be invoked when the user clicks on the dtr entry.
|
||||
/// </summary>
|
||||
public Action<DtrInteractionEvent>? OnClick { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the axis-aligned bounding box of this entry, in screen coordinates.
|
||||
/// </summary>
|
||||
public (Vector2 Min, Vector2 Max) ScreenBounds { get; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -153,17 +146,6 @@ internal sealed unsafe class DtrBarEntry : IDisposable, IDtrBarEntry
|
|||
[Api13ToDo("Maybe make this config scoped to internal name?")]
|
||||
public bool UserHidden => this.configuration.DtrIgnore?.Contains(this.Title) ?? false;
|
||||
|
||||
/// <inheritdoc/>
|
||||
public (Vector2 Min, Vector2 Max) ScreenBounds
|
||||
=> this.TextNode switch
|
||||
{
|
||||
null => default,
|
||||
var node => node->IsVisible()
|
||||
? (new(node->ScreenX, node->ScreenY),
|
||||
new(node->ScreenX + node->GetWidth(), node->ScreenY + node->GetHeight()))
|
||||
: default,
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the internal text node of this entry.
|
||||
/// </summary>
|
||||
|
|
|
|||
|
|
@ -83,12 +83,25 @@ public class BranchSwitcherWindow : Window
|
|||
|
||||
ImGuiHelpers.ScaledDummy(5);
|
||||
|
||||
if (ImGui.Button("Pick & Restart"u8))
|
||||
void Pick()
|
||||
{
|
||||
var config = Service<DalamudConfiguration>.Get();
|
||||
config.DalamudBetaKind = pickedBranch.Key;
|
||||
config.DalamudBetaKey = pickedBranch.Value.Key;
|
||||
config.QueueSave();
|
||||
}
|
||||
|
||||
if (ImGui.Button("Pick"u8))
|
||||
{
|
||||
Pick();
|
||||
this.IsOpen = false;
|
||||
}
|
||||
|
||||
ImGui.SameLine();
|
||||
|
||||
if (ImGui.Button("Pick & Restart"u8))
|
||||
{
|
||||
Pick();
|
||||
|
||||
// If we exit immediately, we need to write out the new config now
|
||||
Service<DalamudConfiguration>.Get().ForceSave();
|
||||
|
|
@ -98,16 +111,7 @@ public class BranchSwitcherWindow : Window
|
|||
|
||||
if (File.Exists(xlPath))
|
||||
{
|
||||
var ps = new ProcessStartInfo
|
||||
{
|
||||
FileName = xlPath,
|
||||
UseShellExecute = false,
|
||||
};
|
||||
|
||||
ps.ArgumentList.Add($"--dalamud-beta-kind={config.DalamudBetaKind}");
|
||||
ps.ArgumentList.Add($"--dalamud-beta-key={config.DalamudBetaKey}");
|
||||
|
||||
Process.Start(ps);
|
||||
Process.Start(xlPath);
|
||||
Environment.Exit(0);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ using System.Globalization;
|
|||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Runtime.Loader;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Dalamud.Configuration;
|
||||
|
|
@ -104,7 +103,7 @@ internal sealed class DalamudPluginInterface : IDalamudPluginInterface, IDisposa
|
|||
/// <summary>
|
||||
/// Gets a value indicating whether auto-updates have already completed this session.
|
||||
/// </summary>
|
||||
public bool IsAutoUpdateComplete => Service<AutoUpdateManager>.GetNullable()?.IsAutoUpdateComplete ?? false;
|
||||
public bool IsAutoUpdateComplete => Service<AutoUpdateManager>.Get().IsAutoUpdateComplete;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the repository from which this plugin was installed.
|
||||
|
|
@ -270,30 +269,6 @@ internal sealed class DalamudPluginInterface : IDalamudPluginInterface, IDisposa
|
|||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the plugin the given assembly is part of.
|
||||
/// </summary>
|
||||
/// <param name="assembly">The assembly to check.</param>
|
||||
/// <returns>The plugin the given assembly is part of, or null if this is a shared assembly or if this information cannot be determined.</returns>
|
||||
public IExposedPlugin? GetPlugin(Assembly assembly)
|
||||
=> AssemblyLoadContext.GetLoadContext(assembly) switch
|
||||
{
|
||||
null => null,
|
||||
var context => this.GetPlugin(context),
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Gets the plugin that loads in the given context.
|
||||
/// </summary>
|
||||
/// <param name="context">The context to check.</param>
|
||||
/// <returns>The plugin that loads in the given context, or null if this isn't a plugin's context or if this information cannot be determined.</returns>
|
||||
public IExposedPlugin? GetPlugin(AssemblyLoadContext context)
|
||||
=> Service<PluginManager>.Get().InstalledPlugins.FirstOrDefault(p => p.LoadsIn(context)) switch
|
||||
{
|
||||
null => null,
|
||||
var p => new ExposedPlugin(p),
|
||||
};
|
||||
|
||||
#region IPC
|
||||
|
||||
/// <inheritdoc cref="DataShare.GetOrCreateData{T}"/>
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Runtime.Loader;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Dalamud.Configuration;
|
||||
|
|
@ -182,20 +180,6 @@ public interface IDalamudPluginInterface
|
|||
/// <returns>Returns false if the DalamudInterface was null.</returns>
|
||||
bool OpenDeveloperMenu();
|
||||
|
||||
/// <summary>
|
||||
/// Gets the plugin the given assembly is part of.
|
||||
/// </summary>
|
||||
/// <param name="assembly">The assembly to check.</param>
|
||||
/// <returns>The plugin the given assembly is part of, or null if this is a shared assembly or if this information cannot be determined.</returns>
|
||||
IExposedPlugin? GetPlugin(Assembly assembly);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the plugin that loads in the given context.
|
||||
/// </summary>
|
||||
/// <param name="context">The context to check.</param>
|
||||
/// <returns>The plugin that loads in the given context, or null if this isn't a plugin's context or if this information cannot be determined.</returns>
|
||||
IExposedPlugin? GetPlugin(AssemblyLoadContext context);
|
||||
|
||||
/// <inheritdoc cref="DataShare.GetOrCreateData{T}"/>
|
||||
T GetOrCreateData<T>(string tag, Func<T> dataGenerator) where T : class;
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ using System.IO;
|
|||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Runtime.ExceptionServices;
|
||||
using System.Runtime.Loader;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
|
|
@ -554,14 +553,6 @@ internal class LocalPlugin : IAsyncDisposable
|
|||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks whether this plugin loads in the given load context.
|
||||
/// </summary>
|
||||
/// <param name="context">The load context to check.</param>
|
||||
/// <returns>Whether this plugin loads in the given load context.</returns>
|
||||
public bool LoadsIn(AssemblyLoadContext context)
|
||||
=> this.loader?.LoadContext == context;
|
||||
|
||||
/// <summary>
|
||||
/// Save this plugin manifest.
|
||||
/// </summary>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue