feat(settings): add LivePreviewPanel skeleton
This commit is contained in:
@@ -0,0 +1,88 @@
|
|||||||
|
using System.Numerics;
|
||||||
|
using System.Threading;
|
||||||
|
using Dalamud.Bindings.ImGui;
|
||||||
|
using Dalamud.Interface.Utility.Raii;
|
||||||
|
using HellionChat.Themes;
|
||||||
|
using HellionChat.Ui.StyleEngine;
|
||||||
|
|
||||||
|
namespace HellionChat.Ui.Components.Settings;
|
||||||
|
|
||||||
|
internal sealed class LivePreviewPanel : IDisposable
|
||||||
|
{
|
||||||
|
// Static counter for S5 reload-stress verification: after 10 reloads the
|
||||||
|
// counter must read 0 (plugin disabled) or 1 (plugin enabled). Anything
|
||||||
|
// higher signals a Dispose skip and a subscriber leak against ThemeRegistry.
|
||||||
|
internal static int InstanceCount;
|
||||||
|
|
||||||
|
private readonly ThemeRegistry _themes;
|
||||||
|
private readonly TokenResolver _resolver;
|
||||||
|
|
||||||
|
public LivePreviewPanel(ThemeRegistry themes, TokenResolver resolver)
|
||||||
|
{
|
||||||
|
_themes = themes;
|
||||||
|
_resolver = resolver;
|
||||||
|
_themes.OnEditingBufferChanged += OnBufferChanged;
|
||||||
|
Interlocked.Increment(ref InstanceCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
_themes.OnEditingBufferChanged -= OnBufferChanged;
|
||||||
|
Interlocked.Decrement(ref InstanceCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnBufferChanged()
|
||||||
|
{
|
||||||
|
// Visual repaint already runs per frame via Draw(); hook reserved for
|
||||||
|
// future telemetry or invalidation. Keep empty in v1.7.0.
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Draw()
|
||||||
|
{
|
||||||
|
using var child = ImRaii.Child("##settings-live-preview", new Vector2(280, 0), true);
|
||||||
|
if (!child.Success)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var theme = _themes.EditingThemeBuffer ?? _themes.Active;
|
||||||
|
|
||||||
|
DrawBrandBar(theme);
|
||||||
|
DrawHonorificHeader(theme);
|
||||||
|
DrawSidebar(theme);
|
||||||
|
DrawMessageList(theme);
|
||||||
|
DrawInputBar(theme);
|
||||||
|
DrawStatusBar(theme);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DrawBrandBar(Theme theme)
|
||||||
|
{
|
||||||
|
// Mini gradient: PrimaryDark → Primary → PrimaryLight → PrimaryGlow.
|
||||||
|
// Implementation lands in next sub-step.
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DrawHonorificHeader(Theme theme)
|
||||||
|
{
|
||||||
|
// Crown + Brackets-Title in Identity. Implementation in next sub-step.
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DrawSidebar(Theme theme)
|
||||||
|
{
|
||||||
|
// 3 channel rows. Implementation in next sub-step.
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DrawMessageList(Theme theme)
|
||||||
|
{
|
||||||
|
// 4 mock messages. Implementation in next sub-step.
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DrawInputBar(Theme theme)
|
||||||
|
{
|
||||||
|
// Pill + text + cog. Implementation in next sub-step.
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DrawStatusBar(Theme theme)
|
||||||
|
{
|
||||||
|
// Status icons. Implementation in next sub-step.
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user