Accumulated polish across the v1.7.1 R-Block reviewer findings. Single sweep before Phase-3 Smoke-Gate. Dep-cycle cleanup (Block H + #30): - CommandHelpWindow drops the dead _inputBar ctor-param + discard that was J's speculative prep; this eliminates the InputBar <-> CommandHelpWindow ctor cycle at its root - InputBar replaces Lazy<CommandHelpWindow> wrapper with direct CommandHelpWindow ctor-param now that the cycle is broken - PluginHostFactory InputBar + CommandHelpWindow DI-regs simplified Dead-field removals: - MessageList drops _themes + _resolver (no reads after H's render-path swap to _chunkRenderer.DrawChunks) - InputBar drops FocusedPreview (no consumer wiring in the new architecture) - InputPreview drops SelectedCursorPos (v1.5.6 letter-by-letter renderer artifact, no callers in R1) - InputPreview drops WhitespaceRegex + partial keyword on class (dead GeneratedRegex with no callers) Visibility fixes: - InputPreview + CommandHelpWindow + DebuggerWindow ctors flip public -> internal for consistency with internal sealed class declarations DI helper extraction: - PluginHostFactory MakePayloadHandler private static helper DRYs the 7-arg list shared between PayloadHandler-singleton and Lender<T> factory ImGui-rendering fix: - MessageList.DrawCompactRow uses SameLine(0f, 0f) — eliminates visible ItemSpacing.X gap between sender-prefix and chunk content Bug fixes: - PayloadHandler.LeftClickPayload drops spurious unsafe keyword (no pointer ops in the method body; v1.5.6 had no unsafe here) - PayloadHandler.StringifyMessage Aggregate seeded with string.Empty to fix empty-sequence crash for pure-icon messages - PayloadHandler.MoveTooltip args==null LogWarning template simplified (?.GetType().Name was always null after the null-check — misleading) - InputBar.SlashCommandCallback drops redundant BufTextLen==0 guard (BufTextSpan handles empty correctly) Comment improvements (WHY-not-WHAT): - ImGuiUtil.cs payload-state cluster comment moved below Buttons array - PayloadHandler: §6.9 trimmed to 1 line, FindCharacterForPayload documented, hq symbol marker restored, MoveTooltip guard documented as defensive v1.7.1 addition, NativeItemTooltips branch explained, §4.2 theme colour swap explained - DebuggerWindow class comment mentions PayloadHandler counters section - InitHostedServices StopAsync explains params-overload semantics - InputBar AppendPending null policy vs SetPendingMessage documented, CommandManager leading-slash assumption noted - PluginHostFactory block comment explains singleton+Lender split Build: 0 warnings, 0 errors. csharpier: clean. Version unchanged.
93 lines
2.8 KiB
C#
93 lines
2.8 KiB
C#
using System.Numerics;
|
|
using Dalamud.Bindings.ImGui;
|
|
using Dalamud.Interface.Utility;
|
|
using Dalamud.Interface.Windowing;
|
|
using Dalamud.Utility;
|
|
using HellionChat.Ui.Components;
|
|
using HellionChat.Util;
|
|
using Lumina.Text.ReadOnly;
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
namespace HellionChat.Ui;
|
|
|
|
internal sealed class CommandHelpWindow : Window
|
|
{
|
|
private readonly ChunkRenderer _chunkRenderer;
|
|
private readonly Windows.MainWindow _mainWindow;
|
|
private readonly ILogger<CommandHelpWindow> _logger;
|
|
|
|
private ReadOnlySeString? _commandDescription;
|
|
|
|
internal CommandHelpWindow(
|
|
ChunkRenderer chunkRenderer,
|
|
Windows.MainWindow mainWindow,
|
|
ILogger<CommandHelpWindow> logger
|
|
)
|
|
: base("command help##chat2-commandhelp")
|
|
{
|
|
_chunkRenderer = chunkRenderer;
|
|
_mainWindow = mainWindow;
|
|
_logger = logger;
|
|
|
|
Flags =
|
|
ImGuiWindowFlags.NoSavedSettings
|
|
| ImGuiWindowFlags.NoTitleBar
|
|
| ImGuiWindowFlags.NoMove
|
|
| ImGuiWindowFlags.NoResize
|
|
| ImGuiWindowFlags.NoFocusOnAppearing
|
|
| ImGuiWindowFlags.AlwaysAutoResize;
|
|
|
|
RespectCloseHotkey = false;
|
|
DisableWindowSounds = true;
|
|
|
|
// Logger injected for future diagnostic hooks (no call-sites yet in R2).
|
|
_ = _logger;
|
|
}
|
|
|
|
public void UpdateContent(ReadOnlySeString commandDesc)
|
|
{
|
|
_commandDescription = commandDesc;
|
|
|
|
var width = 350;
|
|
var scaledWidth = width * ImGuiHelpers.GlobalScale;
|
|
var pos = _mainWindow.LastWindowPos;
|
|
switch (Plugin.Config.CommandHelpSide)
|
|
{
|
|
case CommandHelpSide.Right:
|
|
pos.X += _mainWindow.LastWindowSize.X;
|
|
break;
|
|
case CommandHelpSide.Left:
|
|
pos.X -= scaledWidth;
|
|
break;
|
|
case CommandHelpSide.None:
|
|
default:
|
|
IsOpen = false;
|
|
return;
|
|
}
|
|
|
|
Position = pos;
|
|
SizeConstraints = new WindowSizeConstraints
|
|
{
|
|
// scaledWidth keeps size constraints in the same coordinate space as
|
|
// Position so the help window stays correct width at non-100% DPI.
|
|
MinimumSize = new Vector2(scaledWidth, 0),
|
|
MaximumSize = _mainWindow.LastWindowSize with { X = scaledWidth },
|
|
};
|
|
|
|
IsOpen = true;
|
|
}
|
|
|
|
public override void Draw()
|
|
{
|
|
if (_commandDescription == null)
|
|
return;
|
|
|
|
var chunks = ChunkUtil
|
|
.ToChunks(_commandDescription.Value.ToDalamudString(), ChunkSource.None, null)
|
|
.ToList();
|
|
|
|
// Command-help chunks are read-only description text — no click-targets.
|
|
_chunkRenderer.DrawChunks(chunks, wrap: true, handler: null, lineWidth: 0f);
|
|
}
|
|
}
|