fix(input-preview): wire Inside-mode + Tooltip-mode render paths

InputPreview was only rendered for PreviewPosition.Top/Bottom (the
DrawConditions IsWindowMode gate). Inside-mode (the default) and
Tooltip-mode had no caller at all because v1.5.6's inline-render path
lived on the deleted ChatLogWindow and was not migrated to the v1.7.0
Components-Layer.

Wire Inside-mode by calling CalculatePreviewHeight + DrawPreview
inline from MainWindow.DrawMainArea between the message-list child
and the input bar, with the message-list height reserved for the
preview block. Wire Tooltip-mode by sampling IsItemHovered() on the
input text widget inside InputBar.DrawInputField (analog to the
existing _isFocused = ImGui.IsItemFocused() idiom on the same line)
and exposing it as WasInputTextHovered; MainWindow opens the tooltip
after _input.Draw when both the hover-flag and PreviewPosition.Tooltip
are active.

Plan-drift acknowledged: the plan stated Plugin.InputPreview is
statically reachable, but the property was declared as an instance
member on Plugin.cs:101. Hoisted to internal static to match the
plan's intention (analog to Plugin.Config); updated the single
external instance-access site in PluginLifecycle.RegisterWindows
to the type-qualified form.

Verified in-game: Inside-mode preview block appears between message
list and input bar on first keystroke; tooltip-mode shows preview on
text-field hover only; Top/Bottom-mode unchanged; empty buffer hides
the preview in all modes. dotnet build clean, dotnet csharpier check
clean.
This commit is contained in:
2026-05-28 13:21:59 +02:00
parent 24d3f69041
commit 29fb4b92eb
5 changed files with 51 additions and 5 deletions
+41 -1
View File
@@ -1,5 +1,6 @@
using System.Numerics;
using Dalamud.Bindings.ImGui;
using Dalamud.Interface.Utility;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Interface.Windowing;
using HellionChat.Util;
@@ -138,12 +139,51 @@ internal sealed class MainWindow : Window
{
var inputHeight = Components.InputBar.Height;
using (var messages = ImRaii.Child("##hellion-main-area", new Vector2(-1f, -inputHeight)))
// Shrink the message child when Inside-mode preview is active so the
// inline preview block does not overlap the message list. PreviewHeight
// lags one frame behind on the very first keystroke (same as v1.5.6).
var previewHeight =
Plugin.Config.PreviewPosition is PreviewPosition.Inside
&& Plugin.InputPreview.IsDrawable
? Plugin.InputPreview.PreviewHeight
: 0f;
using (
var messages = ImRaii.Child(
"##hellion-main-area",
new Vector2(-1f, -(inputHeight + previewHeight))
)
)
{
if (messages.Success)
_messages.Draw(_activeTab!);
}
// Inside-mode inline render: measure first so PreviewHeight is fresh
// for the next frame's reservation, then draw between messages and input.
if (
Plugin.Config.PreviewPosition is PreviewPosition.Inside
&& Plugin.InputPreview.IsDrawable
)
{
Plugin.InputPreview.CalculatePreviewHeight();
Plugin.InputPreview.DrawPreview();
}
_input.Draw(_activeTab);
// Tooltip-mode: sampled hover-state from InputBar reflects the actual
// InputText widget (after-Draw IsItemHovered would target a QuickButton).
// ImRaii.Tooltip has no Success guard — BeginTooltip always runs in ctor.
if (
Plugin.Config.PreviewPosition is PreviewPosition.Tooltip
&& Plugin.InputPreview.IsDrawable
&& _input.WasInputTextHovered
)
{
ImGui.SetNextWindowSize(new Vector2(500 * ImGuiHelpers.GlobalScale, -1));
using var tooltip = ImRaii.Tooltip();
Plugin.InputPreview.DrawPreview();
}
}
}