From 24c1e0e75442432c731572864fdb81a3c2b25cbf Mon Sep 17 00:00:00 2001 From: JonKazama-Hellion Date: Sun, 3 May 2026 15:47:05 +0200 Subject: [PATCH 01/17] config: bump LatestVersion to 12, flip PopOutInputEnabled default, add v0.6.1 fields --- ChatTwo/Configuration.cs | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/ChatTwo/Configuration.cs b/ChatTwo/Configuration.cs index f2238de..531d12d 100755 --- a/ChatTwo/Configuration.cs +++ b/ChatTwo/Configuration.cs @@ -34,7 +34,7 @@ public class ConfigKeyBind [Serializable] public class Configuration : IPluginConfiguration { - private const int LatestVersion = 11; + private const int LatestVersion = 12; public int Version { get; set; } = LatestVersion; @@ -111,9 +111,24 @@ public class Configuration : IPluginConfiguration // Hellion Chat — v0.6.0 master switch for the pop-out input bar. // Global on purpose: per-tab makes no sense for Auto-Tell-Tabs which // are session-only and would force the user to re-enable it for every - // new conversation. Default OFF so existing users see no behavior - // change after the v10→v11 migration. - public bool PopOutInputEnabled; + // new conversation. Default flipped to ON in v0.6.1 (was OFF in v0.6.0) + // because tester feedback called the manual toggle "umständlich, wirkt + // unfertig". v11 → v12 migration applies the same flip to existing users. + public bool PopOutInputEnabled = true; + + // Hellion Chat — v0.6.1 One-Time-Hint-Banner that introduces the + // chat-header pop-out toolbar button and reminds about the pop-out + // input default flip. Set to true once the user dismisses the banner + // from the main chat window; never reset after that. + public bool SeenPopOutHeaderHint; + + // Hellion Chat — v0.6.1 opt-in: when true, AutoTellTabsService.SpawnTempTab + // sets tab.PopOut = true on every new auto-tell tab so the conversation + // pops out as its own window directly. Closing the pop-out returns the + // tab to the sidebar via the standard Popout.OnClose() flow. Default OFF + // because the existing sidebar workflow is what most users (especially + // club greeters tracking many parallel tells) expect by default. + public bool AutoTellTabsOpenAsPopout; public int GetRetentionDays(ChatType type) { @@ -311,6 +326,8 @@ public class Configuration : IPluginConfiguration SeenPopOutInputHint = other.SeenPopOutInputHint; PopOutInputEnabled = other.PopOutInputEnabled; + SeenPopOutHeaderHint = other.SeenPopOutHeaderHint; + AutoTellTabsOpenAsPopout = other.AutoTellTabsOpenAsPopout; } } From 7c645afa1de32ba9d26754fac215afd69bcaeb89 Mon Sep 17 00:00:00 2001 From: JonKazama-Hellion Date: Sun, 3 May 2026 15:51:13 +0200 Subject: [PATCH 02/17] migration: add v11 -> v12 hard-flip of PopOutInputEnabled to true --- ChatTwo/Plugin.cs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/ChatTwo/Plugin.cs b/ChatTwo/Plugin.cs index c74306f..58e0e82 100755 --- a/ChatTwo/Plugin.cs +++ b/ChatTwo/Plugin.cs @@ -167,6 +167,23 @@ public sealed class Plugin : IDalamudPlugin "SeenPopOutInputHint added (default false)"); } + // Hellion Chat v11 → v12 — flips Configuration.PopOutInputEnabled from + // the v0.6.0 opt-in default (false) to opt-out (true) per v0.6.1 UX + // polish. Tester feedback: users found the manual toggle "umständlich, + // wirkt unfertig". Hard-flip applies to all existing users — small active + // tester pool means few have made a deliberate opt-out choice yet. + // Communicated via the v0.6.1 hint banner (SeenPopOutHeaderHint reset). + if (Config.Version < 12) + { + Config.PopOutInputEnabled = true; + Config.SeenPopOutHeaderHint = false; + Config.Version = 12; + SaveConfig(); + Log.Information( + "Migrated config v11 → v12: PopOutInputEnabled hard-flipped to true (v0.6.1 default), " + + "SeenPopOutHeaderHint added (default false)"); + } + // Hellion default tab layout for first-run and v10-wipe. // General catches player chat plus active gameplay events; the // System tab takes the technical noise so it does not bury real From cd84ca2b3f4fd96838041994b82556bcc4c125e8 Mon Sep 17 00:00:00 2001 From: JonKazama-Hellion Date: Sun, 3 May 2026 15:55:15 +0200 Subject: [PATCH 03/17] migration: clarify v11->v12 log message and trim rotting comment --- ChatTwo/Plugin.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ChatTwo/Plugin.cs b/ChatTwo/Plugin.cs index 58e0e82..161f48b 100755 --- a/ChatTwo/Plugin.cs +++ b/ChatTwo/Plugin.cs @@ -169,10 +169,10 @@ public sealed class Plugin : IDalamudPlugin // Hellion Chat v11 → v12 — flips Configuration.PopOutInputEnabled from // the v0.6.0 opt-in default (false) to opt-out (true) per v0.6.1 UX - // polish. Tester feedback: users found the manual toggle "umständlich, - // wirkt unfertig". Hard-flip applies to all existing users — small active - // tester pool means few have made a deliberate opt-out choice yet. - // Communicated via the v0.6.1 hint banner (SeenPopOutHeaderHint reset). + // polish. Hard-flip is a deliberate design call (see Spec section 5.7); + // users are notified via the v0.6.1 hint banner (SeenPopOutHeaderHint + // reset). Re-toggle after migration is preserved because this block + // only fires for Version < 12. if (Config.Version < 12) { Config.PopOutInputEnabled = true; @@ -181,7 +181,7 @@ public sealed class Plugin : IDalamudPlugin SaveConfig(); Log.Information( "Migrated config v11 → v12: PopOutInputEnabled hard-flipped to true (v0.6.1 default), " + - "SeenPopOutHeaderHint added (default false)"); + "SeenPopOutHeaderHint reset to false (v0.6.1 banner re-armed)"); } // Hellion default tab layout for first-run and v10-wipe. From aff7a5e7cee2b7c6b7824c4572150d7eb0a2cb5a Mon Sep 17 00:00:00 2001 From: JonKazama-Hellion Date: Sun, 3 May 2026 15:57:10 +0200 Subject: [PATCH 04/17] i18n: add v0.6.1 strings for hint banner and auto-pop-out toggle (DE/EN) --- ChatTwo/Resources/HellionStrings.Designer.cs | 7 +++++++ ChatTwo/Resources/HellionStrings.de.resx | 15 +++++++++++++++ ChatTwo/Resources/HellionStrings.resx | 15 +++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/ChatTwo/Resources/HellionStrings.Designer.cs b/ChatTwo/Resources/HellionStrings.Designer.cs index 8a31150..18de8e1 100644 --- a/ChatTwo/Resources/HellionStrings.Designer.cs +++ b/ChatTwo/Resources/HellionStrings.Designer.cs @@ -179,6 +179,8 @@ internal class HellionStrings internal static string ChatLog_AutoTellTabs_Compact_Description => Get(nameof(ChatLog_AutoTellTabs_Compact_Description)); internal static string ChatLog_AutoTellTabs_GreetedToggle_Name => Get(nameof(ChatLog_AutoTellTabs_GreetedToggle_Name)); internal static string ChatLog_AutoTellTabs_GreetedToggle_Description => Get(nameof(ChatLog_AutoTellTabs_GreetedToggle_Description)); + internal static string ChatLog_AutoTellTabs_OpenAsPopout_Name => Get(nameof(ChatLog_AutoTellTabs_OpenAsPopout_Name)); + internal static string ChatLog_AutoTellTabs_OpenAsPopout_Description => Get(nameof(ChatLog_AutoTellTabs_OpenAsPopout_Description)); internal static string ChatLog_AutoTellTabs_PreloadHint => Get(nameof(ChatLog_AutoTellTabs_PreloadHint)); internal static string ChatLog_AutoTellTabs_ConflictHint => Get(nameof(ChatLog_AutoTellTabs_ConflictHint)); @@ -263,4 +265,9 @@ internal class HellionStrings internal static string Popout_v060_HintText => Get(nameof(Popout_v060_HintText)); internal static string Popout_v060_HintAck => Get(nameof(Popout_v060_HintAck)); internal static string Popout_v060_HintOpenSettings => Get(nameof(Popout_v060_HintOpenSettings)); + + // Hellion Chat — v0.6.1 pop-out header hint banner (discoverability) + internal static string Hint_v061_PopOutHeader_Body => Get(nameof(Hint_v061_PopOutHeader_Body)); + internal static string Hint_v061_PopOutHeader_Ack => Get(nameof(Hint_v061_PopOutHeader_Ack)); + internal static string Hint_v061_PopOutHeader_OpenSettings => Get(nameof(Hint_v061_PopOutHeader_OpenSettings)); } diff --git a/ChatTwo/Resources/HellionStrings.de.resx b/ChatTwo/Resources/HellionStrings.de.resx index dda1718..8b13032 100644 --- a/ChatTwo/Resources/HellionStrings.de.resx +++ b/ChatTwo/Resources/HellionStrings.de.resx @@ -406,6 +406,12 @@ Fügt neben jedem Auto-Tell-Tab einen Klick-Button hinzu, um einen Gesprächspartner als bereits begrüßt zu markieren — der Tab-Name wird dann gedimmt. Nützlich für Club-Greeter, die parallel viele Konversationen führen. Standardmäßig aus. + + Neue /tell-Tabs direkt als Pop-Out öffnen + + + Wenn aktiv, wird jeder neu angelegte /tell-Tab sofort als eigenes Fenster geöffnet. Beim Schließen des Fensters kehrt der Tab in die Seitenleiste zurück. + Die Anzahl der vorgeladenen Tells lässt sich im Datenschutz-Tab einstellen. @@ -594,4 +600,13 @@ Fenster-Settings öffnen + + Du kannst jeden Chat-Tab als eigenes Fenster rauspoppen. Klick auf das Fenster-Symbol oben rechts oder mache einen Rechtsklick auf den Tab. Pop-Out-Eingabe ist jetzt standardmäßig aktiv (abschaltbar unter Einstellungen → Fenster). + + + Verstanden + + + Einstellungen öffnen + diff --git a/ChatTwo/Resources/HellionStrings.resx b/ChatTwo/Resources/HellionStrings.resx index c964166..71750f7 100644 --- a/ChatTwo/Resources/HellionStrings.resx +++ b/ChatTwo/Resources/HellionStrings.resx @@ -406,6 +406,12 @@ Adds a click-to-toggle button next to each auto tell tab to mark a partner as already greeted, dimming the tab name when set. Useful for club greeters tracking many parallel conversations; off by default. + + Open new /tell tabs directly as pop-out + + + When enabled, each newly created /tell tab opens directly as its own window. Closing the window returns the tab to the sidebar. + The number of preloaded tells is configured in the Privacy tab. @@ -594,4 +600,13 @@ Open window settings + + You can pop out any chat tab into its own window. Click the window icon in the top right or right-click the tab. Pop-out input is now enabled by default (can be turned off under Settings → Window). + + + Got it + + + Open Settings + From ccf2ec9f1297ed30e93e588d000c124ad636af53 Mon Sep 17 00:00:00 2001 From: JonKazama-Hellion Date: Sun, 3 May 2026 16:03:05 +0200 Subject: [PATCH 05/17] i18n: tighten v0.6.1 hint body wording (DE/EN tone consistency) --- ChatTwo/Resources/HellionStrings.de.resx | 2 +- ChatTwo/Resources/HellionStrings.resx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ChatTwo/Resources/HellionStrings.de.resx b/ChatTwo/Resources/HellionStrings.de.resx index 8b13032..5002f28 100644 --- a/ChatTwo/Resources/HellionStrings.de.resx +++ b/ChatTwo/Resources/HellionStrings.de.resx @@ -601,7 +601,7 @@ Fenster-Settings öffnen - Du kannst jeden Chat-Tab als eigenes Fenster rauspoppen. Klick auf das Fenster-Symbol oben rechts oder mache einen Rechtsklick auf den Tab. Pop-Out-Eingabe ist jetzt standardmäßig aktiv (abschaltbar unter Einstellungen → Fenster). + Du kannst jeden Chat-Tab als eigenes Fenster öffnen. Klicke auf das Fenster-Symbol oben rechts oder rechtsklicke den Tab. Neu in v0.6.1: die Pop-Out-Eingabe ist standardmäßig aktiv (abschaltbar unter Einstellungen → Fenster). Verstanden diff --git a/ChatTwo/Resources/HellionStrings.resx b/ChatTwo/Resources/HellionStrings.resx index 71750f7..8006988 100644 --- a/ChatTwo/Resources/HellionStrings.resx +++ b/ChatTwo/Resources/HellionStrings.resx @@ -601,7 +601,7 @@ Open window settings - You can pop out any chat tab into its own window. Click the window icon in the top right or right-click the tab. Pop-out input is now enabled by default (can be turned off under Settings → Window). + You can open any chat tab as its own window. Click the window icon in the top right or right-click the tab. New in v0.6.1: pop-out input is enabled by default (can be turned off under Settings → Window). Got it From f207239d56fc6490ba4957f4cb5683761a7c72ca Mon Sep 17 00:00:00 2001 From: JonKazama-Hellion Date: Sun, 3 May 2026 16:04:57 +0200 Subject: [PATCH 06/17] fix: clean up pop-out window when auto-tell tab is LRU-dropped --- ChatTwo/AutoTellTabsService.cs | 16 ++++++++++++++++ ChatTwo/Ui/Popout.cs | 5 +++++ 2 files changed, 21 insertions(+) diff --git a/ChatTwo/AutoTellTabsService.cs b/ChatTwo/AutoTellTabsService.cs index 100f7b0..c713fae 100644 --- a/ChatTwo/AutoTellTabsService.cs +++ b/ChatTwo/AutoTellTabsService.cs @@ -183,6 +183,22 @@ internal sealed class AutoTellTabsService : IDisposable return; } + // v0.6.1 — if the victim is currently popped out, tear down the + // matching Popout window first. Otherwise the window stays in + // PopOutWindows + WindowSystem and renders empty / re-spawns on the + // next AddPopOutsToDraw tick. Latent since pop-outs were introduced; + // becomes visible with AutoTellTabsOpenAsPopout where dropping a + // popped tab is now a routine code path. + if (victim.Tab.PopOut) + { + var popout = _plugin.ChatLogWindow.ActivePopouts + .FirstOrDefault(p => p.TabIdentifier == victim.Tab.Identifier); + if (popout != null) + { + popout.IsOpen = false; + } + } + Plugin.Config.Tabs.RemoveAt(victim.Index); // Re-anchor the active tab so the user does not silently end up on diff --git a/ChatTwo/Ui/Popout.cs b/ChatTwo/Ui/Popout.cs index 80899cb..3d8de1b 100644 --- a/ChatTwo/Ui/Popout.cs +++ b/ChatTwo/Ui/Popout.cs @@ -22,6 +22,11 @@ internal class Popout : Window public ChatInputBar? InputBar { get; private set; } public bool HasFocusedInputBar => InputBar?.IsFocused ?? false; + // Hellion Chat — v0.6.1 expose just the tab identifier (not the whole Tab + // reference) so AutoTellTabsService.DropOldestTempTab can locate the + // matching pop-out window when an LRU temp tab gets evicted. + internal Guid TabIdentifier => Tab.Identifier; + public Popout(ChatLogWindow chatLogWindow, Tab tab, int idx) : base($"{tab.Name}##popout") { ChatLogWindow = chatLogWindow; From f0e0db55e36a1b392b12d2b9a39bc0c92312cfb5 Mon Sep 17 00:00:00 2001 From: JonKazama-Hellion Date: Sun, 3 May 2026 16:11:00 +0200 Subject: [PATCH 07/17] fix: also clean up pop-outs of temp tabs on logout (symmetric to LRU drop) --- ChatTwo/AutoTellTabsService.cs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/ChatTwo/AutoTellTabsService.cs b/ChatTwo/AutoTellTabsService.cs index c713fae..3349dc0 100644 --- a/ChatTwo/AutoTellTabsService.cs +++ b/ChatTwo/AutoTellTabsService.cs @@ -371,6 +371,27 @@ internal sealed class AutoTellTabsService : IDisposable var lastIndexValid = lastIndex >= 0 && lastIndex < Plugin.Config.Tabs.Count; var currentWasTempTab = lastIndexValid && Plugin.Config.Tabs[lastIndex].IsTempTab; + // v0.6.1 — symmetric to DropOldestTempTab cleanup: tear down any + // popped-out temp tab windows before removing the tabs themselves, + // otherwise PopOutWindows + WindowSystem keep ghost entries until + // the next plugin reload. Especially relevant once Auto-Pop-Out is + // enabled — every logout would otherwise leak as many ghosts as + // there were active /tell pop-outs. + var poppedTempTabIds = Plugin.Config.Tabs + .Where(t => t.IsTempTab && t.PopOut) + .Select(t => t.Identifier) + .ToList(); + if (poppedTempTabIds.Count > 0) + { + var poppedSet = poppedTempTabIds.ToHashSet(); + foreach (var popout in _plugin.ChatLogWindow.ActivePopouts + .Where(p => poppedSet.Contains(p.TabIdentifier)) + .ToList()) + { + popout.IsOpen = false; + } + } + Plugin.Config.Tabs.RemoveAll(t => t.IsTempTab); // Force a switch to tab 0 if the active tab was a temp tab OR From 0d39d59a04e38bd878f56101c10e05896ba57c81 Mon Sep 17 00:00:00 2001 From: JonKazama-Hellion Date: Sun, 3 May 2026 16:13:38 +0200 Subject: [PATCH 08/17] feat: opt-in auto-pop-out for new /tell tabs --- ChatTwo/AutoTellTabsService.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ChatTwo/AutoTellTabsService.cs b/ChatTwo/AutoTellTabsService.cs index 3349dc0..5234b0c 100644 --- a/ChatTwo/AutoTellTabsService.cs +++ b/ChatTwo/AutoTellTabsService.cs @@ -223,6 +223,17 @@ internal sealed class AutoTellTabsService : IDisposable PreloadHistory(tab, partner.Name, partner.World, currentMessage.Id); tab.AddMessage(currentMessage, unread: true); + + // Hellion Chat v0.6.1 — opt-in: open new /tell tabs directly as a + // pop-out window. Set BEFORE Tabs.Add so the next render-tick's + // AddPopOutsToDraw() sees PopOut=true and spawns the Popout window + // alongside the tab going into the list. No SaveConfig() because + // auto-tell tabs are IsTempTab (session-only, never persisted). + if (Plugin.Config.AutoTellTabsOpenAsPopout) + { + tab.PopOut = true; + } + Plugin.Config.Tabs.Add(tab); } From 7a6b44048a898511ea81eb4aa8252ccd6edaa712 Mon Sep 17 00:00:00 2001 From: JonKazama-Hellion Date: Sun, 3 May 2026 16:17:24 +0200 Subject: [PATCH 09/17] settings: add 'Open new /tell tabs as pop-out' checkbox --- ChatTwo/Ui/SettingsTabs/Chat.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ChatTwo/Ui/SettingsTabs/Chat.cs b/ChatTwo/Ui/SettingsTabs/Chat.cs index fffb17a..86074bf 100644 --- a/ChatTwo/Ui/SettingsTabs/Chat.cs +++ b/ChatTwo/Ui/SettingsTabs/Chat.cs @@ -73,6 +73,9 @@ internal sealed class Chat : ISettingsTab ImGui.Checkbox(HellionStrings.ChatLog_AutoTellTabs_Compact_Name, ref Mutable.AutoTellTabsCompactDisplay); ImGuiUtil.HelpMarker(HellionStrings.ChatLog_AutoTellTabs_Compact_Description); + ImGui.Checkbox(HellionStrings.ChatLog_AutoTellTabs_OpenAsPopout_Name, ref Mutable.AutoTellTabsOpenAsPopout); + ImGuiUtil.HelpMarker(HellionStrings.ChatLog_AutoTellTabs_OpenAsPopout_Description); + ImGui.Checkbox(HellionStrings.ChatLog_AutoTellTabs_GreetedToggle_Name, ref Mutable.AutoTellTabsShowGreetedToggle); ImGuiUtil.HelpMarker(HellionStrings.ChatLog_AutoTellTabs_GreetedToggle_Description); From c882eac1cae7dadf5f6434688eee710858741bb6 Mon Sep 17 00:00:00 2001 From: JonKazama-Hellion Date: Sun, 3 May 2026 16:27:28 +0200 Subject: [PATCH 10/17] feat: visible pop-out icon button in chat header toolbar --- ChatTwo/Ui/ChatLogWindow.cs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/ChatTwo/Ui/ChatLogWindow.cs b/ChatTwo/Ui/ChatLogWindow.cs index 33763a8..5c8f0db 100644 --- a/ChatTwo/Ui/ChatLogWindow.cs +++ b/ChatTwo/Ui/ChatLogWindow.cs @@ -347,6 +347,11 @@ public sealed class ChatLogWindow : Window if (Plugin.Config.PreviewPosition is PreviewPosition.Inside) height -= Plugin.InputPreview.PreviewHeight; + // Hellion Chat v0.6.1 — subtract the chat header toolbar (single icon + // button) from the message-log height budget so the bottom of the log + // does not get clipped by the new toolbar row. + height -= ImGui.GetFrameHeightWithSpacing(); + return height; } @@ -1295,6 +1300,7 @@ public sealed class ChatLogWindow : Window TabSwitched(tab, previousTab); tab.Unread = 0; + DrawChatHeaderToolbar(tab); DrawMessageLog(tab, PayloadHandler, GetRemainingHeightForMessageLog(), hasTabSwitched); } @@ -1427,11 +1433,31 @@ public sealed class ChatLogWindow : Window } if (currentTab > -1) + { + DrawChatHeaderToolbar(Plugin.Config.Tabs[currentTab]); DrawMessageLog(Plugin.Config.Tabs[currentTab], PayloadHandler, childHeight, hasTabSwitched); + } Plugin.WantedTab = null; } + // Hellion Chat v0.6.1 — visible pop-out trigger right above the message + // log so users discover the feature without having to right-click the tab. + // Renders only for the active tab in the main ChatLogWindow; pop-out + // windows have their own render path and skip this toolbar. + private void DrawChatHeaderToolbar(Tab tab) + { + var avail = ImGui.GetContentRegionAvail().X; + var iconWidth = ImGui.GetFrameHeight(); + ImGui.SetCursorPosX(ImGui.GetCursorPosX() + avail - iconWidth); + + if (ImGuiUtil.IconButton(FontAwesomeIcon.WindowRestore, tooltip: Language.ChatLog_Tabs_PopOut)) + { + tab.PopOut = true; + Plugin.SaveConfig(); + } + } + private void DrawTabContextMenu(Tab tab, int i) { using var contextMenu = ImRaii.ContextPopupItem($"tab-context-menu-{i}"); From 9506af49dbc434d6627f3539114c7fba8bbe07e2 Mon Sep 17 00:00:00 2001 From: JonKazama-Hellion Date: Sun, 3 May 2026 16:38:31 +0200 Subject: [PATCH 11/17] feat: one-time hint banner introduces v0.6.1 pop-out toolbar and default flip --- ChatTwo/Ui/ChatLogWindow.cs | 70 +++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/ChatTwo/Ui/ChatLogWindow.cs b/ChatTwo/Ui/ChatLogWindow.cs index 5c8f0db..f8511d9 100644 --- a/ChatTwo/Ui/ChatLogWindow.cs +++ b/ChatTwo/Ui/ChatLogWindow.cs @@ -352,6 +352,10 @@ public sealed class ChatLogWindow : Window // does not get clipped by the new toolbar row. height -= ImGui.GetFrameHeightWithSpacing(); + // Hellion Chat v0.6.1 — der Hint-Banner verbraucht Höhe wenn sichtbar + // (0 wenn dismissed). Field wird in DrawChatLog vor Tab-Render gesetzt. + height -= _v061HintBannerHeight; + return height; } @@ -548,6 +552,12 @@ public sealed class ChatLogWindow : Window if (IsChatMode && Plugin.InputPreview.IsDrawable) Plugin.InputPreview.CalculatePreview(); + // Hellion Chat v0.6.1 — render the one-time hint banner first so it + // sits above the tab area / sidebar in full window width. Stash the + // height for GetRemainingHeightForMessageLog so the message log + // shrinks accordingly while the banner is visible. + _v061HintBannerHeight = DrawV061HintBannerIfNeeded(); + if (Plugin.Config.SidebarTabView) DrawTabSidebar(); else @@ -1458,6 +1468,60 @@ public sealed class ChatLogWindow : Window } } + // Hellion Chat v0.6.1 — One-Time-Hint-Banner introducing the chat header + // pop-out toolbar button and the right-click pathway. Reuses the visual + // pattern from Popout.cs DrawHintBannerIfNeeded so users see a familiar + // dismiss-affordance. Returns the vertical space the banner consumed + // (0 when not shown) so the message log can shrink accordingly. + private float DrawV061HintBannerIfNeeded() + { + if (Plugin.Config.SeenPopOutHeaderHint) + return 0f; + + var hintText = Resources.HellionStrings.Hint_v061_PopOutHeader_Body; + var ackLabel = Resources.HellionStrings.Hint_v061_PopOutHeader_Ack; + var openLabel = Resources.HellionStrings.Hint_v061_PopOutHeader_OpenSettings; + + var startY = ImGui.GetCursorPosY(); + + var bg = new System.Numerics.Vector4(0.16f, 0.20f, 0.28f, 1f); + ImGui.PushStyleColor(ImGuiCol.ChildBg, bg); + ImGui.PushStyleVar(ImGuiStyleVar.FrameBorderSize, 1f); + + var dismiss = false; + var openSettings = false; + using (var child = ImRaii.Child("##v061-pop-out-header-hint", new System.Numerics.Vector2(0f, 84f), true)) + { + if (child) + { + ImGui.TextWrapped(hintText); + if (ImGui.Button(ackLabel)) + dismiss = true; + ImGui.SameLine(); + if (ImGui.Button(openLabel)) + { + dismiss = true; + openSettings = true; + } + } + } + + ImGui.PopStyleVar(); + ImGui.PopStyleColor(); + ImGui.Spacing(); + + if (dismiss) + { + Plugin.Config.SeenPopOutHeaderHint = true; + Plugin.SaveConfig(); + Plugin.Log.Debug("v0.6.1 pop-out header hint dismissed"); + if (openSettings) + Plugin.SettingsWindow.Toggle(); + } + + return ImGui.GetCursorPosY() - startY; + } + private void DrawTabContextMenu(Tab tab, int i) { using var contextMenu = ImRaii.ContextPopupItem($"tab-context-menu-{i}"); @@ -1517,6 +1581,12 @@ public sealed class ChatLogWindow : Window internal readonly List PopOutDocked = []; internal readonly HashSet PopOutWindows = []; + // Hellion Chat v0.6.1 — height the v0.6.1 hint banner consumed in the + // current frame, read by GetRemainingHeightForMessageLog so the message + // log can shrink. Reset to 0 each frame; positive only when the banner + // actually rendered. + private float _v061HintBannerHeight; + // v0.6.0 — live enumeration of all active Popout windows so the // KeybindManager can find a focused ChatInputBar to forward tab-cycle // keybinds to. Filter on IsOpen prevents touching closed-but-still- From ac158907ea31a8a1d71b66b81341f969900d0588 Mon Sep 17 00:00:00 2001 From: JonKazama-Hellion Date: Sun, 3 May 2026 16:43:12 +0200 Subject: [PATCH 12/17] docs: clarify _v061HintBannerHeight reset semantics --- ChatTwo/Ui/ChatLogWindow.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ChatTwo/Ui/ChatLogWindow.cs b/ChatTwo/Ui/ChatLogWindow.cs index f8511d9..bf87da1 100644 --- a/ChatTwo/Ui/ChatLogWindow.cs +++ b/ChatTwo/Ui/ChatLogWindow.cs @@ -1583,8 +1583,9 @@ public sealed class ChatLogWindow : Window // Hellion Chat v0.6.1 — height the v0.6.1 hint banner consumed in the // current frame, read by GetRemainingHeightForMessageLog so the message - // log can shrink. Reset to 0 each frame; positive only when the banner - // actually rendered. + // log can shrink. Unconditionally reassigned at the top of DrawChatLog + // (before any tab-area render) so the value is always in sync with the + // current frame. Returns 0 once the banner is dismissed. private float _v061HintBannerHeight; // v0.6.0 — live enumeration of all active Popout windows so the From f2f7599f81e650f48541d1c737548ec6cfcacb31 Mon Sep 17 00:00:00 2001 From: JonKazama-Hellion Date: Sun, 3 May 2026 16:49:24 +0200 Subject: [PATCH 13/17] fix: remove double height subtraction for header toolbar and hint banner --- ChatTwo/Ui/ChatLogWindow.cs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/ChatTwo/Ui/ChatLogWindow.cs b/ChatTwo/Ui/ChatLogWindow.cs index bf87da1..2a3c866 100644 --- a/ChatTwo/Ui/ChatLogWindow.cs +++ b/ChatTwo/Ui/ChatLogWindow.cs @@ -347,14 +347,12 @@ public sealed class ChatLogWindow : Window if (Plugin.Config.PreviewPosition is PreviewPosition.Inside) height -= Plugin.InputPreview.PreviewHeight; - // Hellion Chat v0.6.1 — subtract the chat header toolbar (single icon - // button) from the message-log height budget so the bottom of the log - // does not get clipped by the new toolbar row. - height -= ImGui.GetFrameHeightWithSpacing(); - - // Hellion Chat v0.6.1 — der Hint-Banner verbraucht Höhe wenn sichtbar - // (0 wenn dismissed). Field wird in DrawChatLog vor Tab-Render gesetzt. - height -= _v061HintBannerHeight; + // Hellion Chat v0.6.1 — kein expliziter Abzug mehr für die Header- + // Toolbar (Task 7) und den Hint-Banner (Task 8): beide rendern VOR + // diesem Aufruf, daher ist GetContentRegionAvail().Y oben bereits um + // ihre verbrauchte Höhe reduziert. Der vorherige doppelte Subtrahier + // hat unter dem Eingabefeld eine tote Zone von Toolbar+Banner-Höhe + // erzeugt sobald der Banner sichtbar war. return height; } From ecd46ed6303a88c6b56205dd6ba55dd09453c11c Mon Sep 17 00:00:00 2001 From: JonKazama-Hellion Date: Sun, 3 May 2026 16:56:28 +0200 Subject: [PATCH 14/17] release: bump version to 0.6.1, add changelog and Hellion Forge Discord link --- ChatTwo/ChatTwo.csproj | 2 +- ChatTwo/HellionChat.yaml | 46 ++++++++++++++++++++++------------------ README.md | 12 +++++++++-- SUPPORT.md | 9 +++++--- repo.json | 14 ++++++------ 5 files changed, 49 insertions(+), 34 deletions(-) diff --git a/ChatTwo/ChatTwo.csproj b/ChatTwo/ChatTwo.csproj index 9b43ba3..69b12b1 100644 --- a/ChatTwo/ChatTwo.csproj +++ b/ChatTwo/ChatTwo.csproj @@ -4,7 +4,7 @@ 0.1.0 is our bootstrap release; the underlying Chat 2 base is called out in the yaml changelog so users can see what it derives from. --> - 0.6.0 + 0.6.1 enable