Refactored many parts, added settings for detection
This commit is contained in:
@@ -14,6 +14,7 @@ using LightlessSync.Interop.Ipc;
|
||||
using LightlessSync.LightlessConfiguration;
|
||||
using LightlessSync.LightlessConfiguration.Configurations;
|
||||
using LightlessSync.LightlessConfiguration.Models;
|
||||
using LightlessSync.PlayerData.Factories;
|
||||
using LightlessSync.PlayerData.Handlers;
|
||||
using LightlessSync.PlayerData.Pairs;
|
||||
using LightlessSync.Services;
|
||||
@@ -40,6 +41,7 @@ using System.Globalization;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Net.Http.Json;
|
||||
using System.Numerics;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Text.Json;
|
||||
|
||||
@@ -105,8 +107,8 @@ public class SettingsUi : WindowMediatorSubscriberBase
|
||||
};
|
||||
private readonly UiSharedService.TabOption<TransferSettingsTab>[] _transferTabOptions = new UiSharedService.TabOption<TransferSettingsTab>[2];
|
||||
private readonly List<UiSharedService.TabOption<ServerSettingsTab>> _serverTabOptions = new(4);
|
||||
private readonly string[] _generalTreeNavOrder = new[]
|
||||
{
|
||||
private readonly string[] _generalTreeNavOrder =
|
||||
[
|
||||
"Import & Export",
|
||||
"Popup & Auto Fill",
|
||||
"Behavior",
|
||||
@@ -116,7 +118,8 @@ public class SettingsUi : WindowMediatorSubscriberBase
|
||||
"Colors",
|
||||
"Server Info Bar",
|
||||
"Nameplate",
|
||||
};
|
||||
"Animation & Bones"
|
||||
];
|
||||
private static readonly HashSet<string> _generalNavSeparatorAfter = new(StringComparer.Ordinal)
|
||||
{
|
||||
"Popup & Auto Fill",
|
||||
@@ -1141,7 +1144,7 @@ public class SettingsUi : WindowMediatorSubscriberBase
|
||||
|
||||
private async Task<List<string>?> RunSpeedTest(List<string> servers, CancellationToken token)
|
||||
{
|
||||
List<string> speedTestResults = new();
|
||||
List<string> speedTestResults = [];
|
||||
foreach (var server in servers)
|
||||
{
|
||||
HttpResponseMessage? result = null;
|
||||
@@ -3085,10 +3088,81 @@ public class SettingsUi : WindowMediatorSubscriberBase
|
||||
}
|
||||
|
||||
ImGui.Separator();
|
||||
ImGui.Dummy(new Vector2(10));
|
||||
_uiShared.BigText("Animation");
|
||||
|
||||
using (var animationTree = BeginGeneralTree("Animation & Bones", UIColors.Get("LightlessPurple")))
|
||||
{
|
||||
if (animationTree.Visible)
|
||||
{
|
||||
ImGui.TextUnformatted("Animation Options");
|
||||
|
||||
var modes = new[]
|
||||
{
|
||||
AnimationValidationMode.Unsafe,
|
||||
AnimationValidationMode.Safe,
|
||||
AnimationValidationMode.Safest,
|
||||
};
|
||||
|
||||
var labels = new[]
|
||||
{
|
||||
"Unsafe",
|
||||
"Safe (Bones)",
|
||||
"Safest (Race + Bones)",
|
||||
};
|
||||
|
||||
var tooltips = new[]
|
||||
{
|
||||
"No validation. Fastest, but may allow incompatible animations (riskier).",
|
||||
"Validates bone indices against your current skeleton (recommended).",
|
||||
"Requires matching skeleton race + bone compatibility (strictest).",
|
||||
};
|
||||
|
||||
|
||||
var currentMode = _configService.Current.AnimationValidationMode;
|
||||
int selectedIndex = Array.IndexOf(modes, currentMode);
|
||||
if (selectedIndex < 0) selectedIndex = 1;
|
||||
|
||||
ImGui.SetNextItemWidth(140 * ImGuiHelpers.GlobalScale);
|
||||
|
||||
bool open = ImGui.BeginCombo("Animation validation", labels[selectedIndex]);
|
||||
|
||||
if (ImGui.IsItemHovered())
|
||||
ImGui.SetTooltip(tooltips[selectedIndex]);
|
||||
|
||||
if (open)
|
||||
{
|
||||
for (int i = 0; i < modes.Length; i++)
|
||||
{
|
||||
bool isSelected = (i == selectedIndex);
|
||||
|
||||
if (ImGui.Selectable(labels[i], isSelected))
|
||||
{
|
||||
selectedIndex = i;
|
||||
_configService.Current.AnimationValidationMode = modes[i];
|
||||
_configService.Save();
|
||||
}
|
||||
|
||||
if (ImGui.IsItemHovered())
|
||||
ImGui.SetTooltip(tooltips[i]);
|
||||
|
||||
if (isSelected)
|
||||
ImGui.SetItemDefaultFocus();
|
||||
}
|
||||
|
||||
ImGui.EndCombo();
|
||||
}
|
||||
|
||||
UiSharedService.ColoredSeparator(UIColors.Get("LightlessPurple"), 1.5f);
|
||||
ImGui.TreePop();
|
||||
animationTree.MarkContentEnd();
|
||||
}
|
||||
}
|
||||
|
||||
ImGui.EndChild();
|
||||
ImGui.EndGroup();
|
||||
|
||||
ImGui.Separator();
|
||||
generalSelune.DrawHighlightOnly(ImGui.GetIO().DeltaTime);
|
||||
}
|
||||
}
|
||||
@@ -3178,6 +3252,7 @@ public class SettingsUi : WindowMediatorSubscriberBase
|
||||
return 1f - (elapsed / GeneralTreeHighlightDuration);
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Auto)]
|
||||
private struct GeneralTreeScope : IDisposable
|
||||
{
|
||||
private readonly bool _visible;
|
||||
@@ -3485,7 +3560,7 @@ public class SettingsUi : WindowMediatorSubscriberBase
|
||||
_uiShared.DrawHelpText("Controls whether Lightless reduces index textures that exceed the size limit.");
|
||||
|
||||
var dimensionOptions = new[] { 512, 1024, 2048, 4096 };
|
||||
var optionLabels = dimensionOptions.Select(static value => value.ToString()).ToArray();
|
||||
var optionLabels = dimensionOptions.Select(selector: static value => value.ToString()).ToArray();
|
||||
var currentDimension = textureConfig.TextureDownscaleMaxDimension;
|
||||
var selectedIndex = Array.IndexOf(dimensionOptions, currentDimension);
|
||||
if (selectedIndex < 0)
|
||||
|
||||
Reference in New Issue
Block a user