Commit Graph
100 Commits
Author SHA1 Message Date
JonKazama-Hellion 01fc69efda feat(input-bar): add SetPendingMessage/AppendPending mutators + Activate/FocusedPreview flags
Replaces v1.5.6's direct LogWindow.Chat mutation pattern with typed mutators
that LogWarning + clip/drop on BufferCapacity overflow (silent-overwrite
semantics preserved, but overflow is now observable via /xllog).

Plumbing for v1.7.1 PayloadHandler resurrection — DrawPlayerPopup (tell-
prefix) and DrawStatusPopup (status-link append) will call these mutators
instead of mutating a public field.
2026-05-27 07:59:39 +02:00
JonKazama-Hellion f5f9a4e4da feat(config): bump schema v20→v21 with ScreenshotMode field
Adds persisted ScreenshotMode flag to Configuration (was previously a
ChatLogWindow-instance field in v1.5.6). Schema bump is additive — no
breaking change. SelfTest renamed V20→V21 with matching version-gate
flip and new touch-test for the new field.

Pre-flight for v1.7.1 PayloadHandler-Pipeline Resurrection.
2026-05-27 07:47:15 +02:00
JonKazama-Hellion ced22d73b2 chore(format): csharpier line-break LINQ chain in ThemePickerCategoryStep 2026-05-26 23:02:47 +02:00
JonKazama-Hellion d2b2ebf17f test(selftests): verify TypingIpc state matches input bar 2026-05-26 23:01:59 +02:00
JonKazama-Hellion 125a41c6a0 test(selftests): verify OpenMainUi targets MainWindow not Settings 2026-05-26 23:01:26 +02:00
JonKazama-Hellion dc8d2ae8b7 test(selftests): cover Settings window toggle 2026-05-26 23:00:59 +02:00
JonKazama-Hellion 22bf1dd110 test(selftests): cover theme picker category map 2026-05-26 22:57:11 +02:00
JonKazama-Hellion 4595de5efc test(selftests): implement ColorEditorBufferStep against editing buffer 2026-05-26 22:50:13 +02:00
JonKazama-Hellion 730e15d108 chore: remove v1.7.0 'lands in' placeholders 2026-05-26 20:44:41 +02:00
JonKazama-Hellion 545ddfbfcc chore(ui): delete settings stub from v1.6.0 2026-05-26 20:37:58 +02:00
JonKazama-Hellion f510d01f46 feat(plugin): switch SettingsWindow type to new Ui.Windows namespace 2026-05-26 20:29:35 +02:00
JonKazama-Hellion 490da3e908 feat(settings): add About tab with brand, links, credits 2026-05-26 20:20:53 +02:00
JonKazama-Hellion 262fb3022a feat(settings): add Data & Privacy tab with retention and filter 2026-05-26 20:05:52 +02:00
JonKazama-Hellion 0512d4c9d2 feat(settings): add Channels tab with auto-tell and sidebar configs 2026-05-26 19:53:57 +02:00
JonKazama-Hellion 1f9afe182a feat(settings): add Window tab with layout/opacity/resize 2026-05-26 19:26:32 +02:00
JonKazama-Hellion 2c23a88e9d chore(format): csharpier line-break GeneralTab toggle calls 2026-05-26 19:12:02 +02:00
JonKazama-Hellion 2507ed5197 feat(settings): add Chat tab including command help side 2026-05-26 19:12:01 +02:00
JonKazama-Hellion 7e933cb8ba feat(settings): add General tab with direct-save toggles 2026-05-26 18:57:34 +02:00
JonKazama-Hellion 26c395419a feat(settings): wire Appearance tab with import/export row 2026-05-26 18:51:24 +02:00
JonKazama-Hellion 12bf83b826 feat(windows): add SettingsWindow skeleton (W1) 2026-05-26 18:35:30 +02:00
JonKazama-Hellion 6bbdc67089 feat(settings): register LivePreviewPanel in DI 2026-05-26 18:24:29 +02:00
JonKazama-Hellion 13ca241ac7 feat(settings): render six mock elements in live preview 2026-05-26 18:20:57 +02:00
JonKazama-Hellion 304e1aab20 feat(settings): add LivePreviewPanel skeleton 2026-05-26 18:00:53 +02:00
JonKazama-Hellion cce56610fc feat(settings): register ColorPicker in DI 2026-05-26 17:37:47 +02:00
JonKazama-Hellion eed919e961 feat(settings): wire ColorPicker sections for all 21 slots 2026-05-26 17:33:11 +02:00
JonKazama-Hellion 21689655da feat(settings): add ColorPicker skeleton with lifecycle 2026-05-26 17:05:40 +02:00
JonKazama-Hellion c6f7266194 feat(settings): add ThemePicker with five categories and switch lock 2026-05-26 16:36:54 +02:00
JonKazama-Hellion a73cad1534 feat(settings): add ContentArea wrapper 2026-05-26 16:08:27 +02:00
JonKazama-Hellion bb37e19176 feat(settings): add TabSidebar with seven entries 2026-05-26 15:59:01 +02:00
JonKazama-Hellion ffef5634ed feat(util): add RgbaToVector4 and Vector4ToRgba helpers for color picker 2026-05-26 15:25:31 +02:00
JonKazama-Hellion 947c4b2061 fix(themes): bump example-theme.json to schemaVersion 2 2026-05-26 14:47:02 +02:00
JonKazama-Hellion d156ff4c56 fix(plugin): route OpenMainUi to MainWindow instead of Settings 2026-05-26 14:11:34 +02:00
JonKazama-Hellion 7979568165 refactor(ipc): drop this.-qualifier and trim BuildState comments
Same shadowing-via-instance-property as Plugin.CurrentTab above. Comments
trimmed to default 1-3 line density; security/threading WHY-blocks earn
their lines when they document non-obvious invariants, not standard C#
name resolution.
2026-05-26 14:04:46 +02:00
JonKazama-Hellion 93bfd408bc feat(ipc): wire TypingIpc state from InputBar API 2026-05-26 13:38:21 +02:00
JonKazama-Hellion e01de0403a feat(input): expose state API, wire settings cog, add test hooks 2026-05-26 13:31:00 +02:00
JonKazama-Hellion 11eb7b9e90 fix(themes): tighten editing-buffer save path (tmp cleanup, log-PII, line-refs)
Three review-pass fixes on SaveEditingBuffer:

- Wrap File.Move in try/catch that deletes the .tmp sibling on failure
  (AV-scanner lock, EXDEV, share-violation) then rethrows so the outer
  IOException catch still owns the error path. Avoids accumulating
  '<slug>.json.tmp' litter in the themes dir on retry storms.

- Reduce PII in the five new LogWarning calls that previously included
  full paths containing the user's home directory. Filename-only via
  Path.GetFileName is sufficient for triage; the two forensics-critical
  path-escape log calls keep full paths because diagnosing the escape
  needs the resolved target. WHY-comment anchors the v1.8.0 PII
  re-audit roadmap.

- Replace seven hardcoded 'ThemeRegistry.cs:<line>' references in
  comments with method-name + symbol descriptions so future Switch/
  RefreshCustomCache refactors do not bit-rot the comments.

Build 0/0, csharpier clean.
2026-05-26 13:16:57 +02:00
JonKazama-Hellion 4f81cd1f24 feat(themes): add editing buffer with begin/update/save/discard 2026-05-26 13:03:30 +02:00
JonKazama-Hellion 8e7149cadc fix(ui): guard sidebar row at min drag and widen system-icon match
DrawRow asserted on a zero-width InvisibleButton when the window was
dragged below the pop-out hit threshold — the row now drops out cleanly
under 2px of remaining sidebar width, and the pop-out button only
splits off when there's room for both hit areas. The trailing pop-out
icon is hidden too when its strip is collapsed, so the row stays as a
single selectable strip on extreme drags.

System icon path: ResolveTabIcon used to look only at the first key in
SelectedChannels, so a System tab whose first filter happened to be a
generic ChatType slipped through to Comment. The resolve now walks
every key and keeps the first non-Comment match, and a final
case-insensitive name match flips the icon to fa-cog when the user's
filter set falls completely outside the channel-type table.
2026-05-23 21:08:22 +02:00
JonKazama-Hellion 2f099fd4e1 fix(ui): clickable channel pill, auto-seed channel, kill outer scrollbar
Three smoke bugs from the second in-game test:

1. The channel pill was draw-list only, so it didn't react to clicks
   and there was no way to switch channels inside a tab. The pill now
   has a hit area on top and opens a popup that lists every ChatType
   in tab.SelectedChannels with a ToInputChannel mapping; selecting
   one writes through CurrentChannel.SetChannel.

2. Switching to Allgemein / Gruppe / Linkshell still showed "—"
   because tab.CurrentChannel.Channel stayed at Invalid until somebody
   set it. The sidebar now seeds CurrentChannel on tab activation by
   walking SelectedChannels for the first key with a valid mapping,
   so every tab opens with its own real channel instead of inheriting
   the FC default.

3. MainWindow still surfaced an outer scrollbar next to the message
   list's own scroll. Adding NoScrollbar + NoScrollWithMouse to the
   window flags strips the second bar — the body child owns scroll on
   its own.

Plus the system-icon path: System / BattleSystem / GatheringSystem /
Error / Notice / LootNotice all map to fa-cog now, so the System tab
renders the gear instead of falling back to the generic comment.
2026-05-23 20:58:50 +02:00
JonKazama-Hellion 52b0fa7c67 fix(ui): wire chat send and fix sidebar icons, channel pill, scrollbar
Five smoke bugs from the first in-game test:

1. Sidebar showed fa-comment for every tab because the resolve path
   only honoured tab.Icon. Channel-type fallback restored — auto-tell
   tabs render the envelope, the rest map their first SelectedChannels
   key onto FontAwesome (Linkshells → link, FC → users, Party →
   user-friends, System/Echo → cog, emotes → comments).

2. InputBar's channel pill read from tab.Channel (the saved default),
   which is null on most non-FC tabs and rendered as "—". The pill now
   reads tab.CurrentChannel.Channel first so the runtime input state
   surfaces on every tab, with the saved default as a second fallback.

3. MessageList was making its own ImRaii.Child inside the main-area
   child MainWindow already owns. That nested scroll created the second
   scrollbar on the outer window. The component now lays out directly
   into the parent's scroll region.

4. The input field reserved 90px for the three FontAwesome buttons,
   which clipped them on standard frame padding. Reserve raised to
   130px so the trailing buttons fully render.

5. Pressing Enter dropped the buffer — there was no send wiring. The
   field now uses ImGuiInputTextFlags.EnterReturnsTrue and routes the
   pending message through GameFunctions.ChatBox.SendMessage. Lines
   that don't start with a slash get the active channel's prefix
   prepended so typing in /fc lands on the FC channel instead of the
   current game-side default.

InputBar gains an ILogger<InputBar> for the send-failure path; the
DI registration in PluginHostFactory is updated to match.
2026-05-23 20:50:54 +02:00
JonKazama-Hellion 0109bfd222 test(selftests): add v1.6.0 SelfTest steps from sub-spec
Six new ISelfTestStep entries register with the Dalamud SelfTestRegistry:
SidebarModeAutoSwitch probes the width threshold both above and below the
exact boundary so the >= contract stays pinned; ColorEditorBuffer is a
placeholder until the picker arrives; ConfigMigrationV20 asserts the
schema stamp and the five v20 field defaults; HoverSheenAlloc drives 100
hovered frames against three constant keys and a final un-hover sweep to
exercise the cleanup branch; HonorificHeaderRender runs one Draw call on
the live component to catch IPC fallback crashes; PerformanceBaseline
prints a JSON line of the IO counters so the cycle notes can pick up a
snapshot. MainWindow gets internal accessors so the probes can reach the
sidebar and honorific header without widening the public surface.
2026-05-23 20:35:01 +02:00
JonKazama-Hellion cf4705e01f refactor(ui): retire ChatLogWindow and the v1.5.6 chat-window layer
The legacy ChatLogWindow.cs and its tightly coupled neighbours are gone:
PayloadHandler, Popout, ChatInputBar, AutoCompleteInfo, AutoTellTabTint,
the three tab-icon helpers, the old Ui/StatusBar and Ui/SymbolPicker
behind the components-layer replacements, HellionStyle + helpers, the
CompactInputSubmitter test mirror and the QuickPickerSelfTestStep. The
new component layer (MainWindow + the five components + GlobalStyleScope)
now drives the whole chat surface.

InputPreview, CommandHelpWindow and Debugger lose their ChatLogWindow
backref. The first two are skeleton windows for now — DrawConditions
always returns false until the new chat layer exposes equivalent state.
Debugger keeps the current-tab and vanilla-chat blocks; the payload
counters are explicitly marked offline. DbViewer renders Sender/Content
columns as plain TextValue strings instead of the removed DrawChunks.

GameFunctions.Chat and GameFunctions.KeybindManager keep the hook
plumbing intact but mark every ChatLogWindow.Activated /
ChangeTabDelta / TellSpecial site as offline so the FFXIV-side
integration still compiles and runs without an Activated entry point.
TypingIpc.BuildState reports the IPC state as not-typing / not-focused
until the new chat layer surfaces real focus and buffer state again.

Plugin.cs Draw uses StyleEngine.GlobalStyleScope.Push for the per-frame
theme push and stops calling BeginFrame / FinalizeFrame / HideStateCheck
/ DefaultText through the dead window. ImGuiUtil drops PostPayload +
WrapText + the surrounding word-wrap pipeline. PluginHostFactory and
PluginLifecycle drop the legacy DI singletons and AddWindow entries.

Build is clean and csharpier is clean across the trimmed 131-file tree.
2026-05-23 20:31:12 +02:00
JonKazama-Hellion c9e746a8e3 refactor(settings): reduce SettingsWindow to a stub and drop the tab system
The seven settings tabs and the overview helper are removed. The new
settings UI lands in a later cycle and will be rebuilt from scratch on
the v2.x component layer; keeping the v1.5.6 tab classes around in the
meantime would only carry dead dependencies through the rest of this
cycle. The window stays registered so /hellion settings, the slash
command path, and the UiBuilder open handlers all still resolve.
2026-05-23 20:12:16 +02:00
JonKazama-Hellion ec02a5f381 feat(commands): consolidate /hellion and /clearhellion in Plugin.SetupCommands
/hellion routes through one handler with three subcommands: empty arg
toggles the main window, "settings" toggles the settings stub (full
settings UI lands later), "reset" calls ThemeRegistry.SwitchSilent on the
default slug so a broken custom theme can be unloaded without a settings
UI. /clearhellion now lives next to /hellion instead of inside the chat
window. ChatLogWindow loses its old register/unregister pair so the two
slash-commands stop double-binding.
2026-05-23 20:08:09 +02:00
JonKazama-Hellion 576cd6dafd feat(ui): assemble MainWindow from the components layer
Top-level chat window composes HonorificHeader, Sidebar, MessageList,
InputBar and StatusBar in the layout from the master spec: header row,
horizontal body (sidebar + main area with messages + input), status
strip pinned to the bottom. Component types are fully qualified through
the Ui.Components prefix so the v1.5.6 Ui.StatusBar type cannot shadow
the new layer through parent-namespace resolution before it is removed.
Toggle is a new-shadow on Window.Toggle so the open path also writes
Config.MainWindowOpen; OnClose covers the close path through the base
behaviour. InputBar.Height is now public so the layout math can reach
it from outside the components folder.
2026-05-23 19:52:37 +02:00
JonKazama-Hellion 0fc2512f3e feat(ui): rebuild StatusBar inside the components layer
Same 1Hz-cached slot layout (channel indicator, privacy badge, counts,
tells, version + brand) but ThemeRegistry and FontManager arrive via
constructor injection rather than the Plugin static bridge, and Draw
takes the active tab directly so the component does not have to reach
back through Plugin.CurrentTab. Pure helpers (FormatCounts, FormatTells,
AggregateForStatusBar) stay static so the build suite can pin them
without an ImGui frame. The v1.5.6 Ui/StatusBar.cs stays in place until
the cleanup block removes it.
2026-05-23 19:35:50 +02:00
JonKazama-Hellion 36afce21e5 feat(ui): add InputBar with channel pill and symbol picker overlay
Channel pill picks Token.AccentEmber when the tab is a tell (matched by
IsTempTab + a set TellTarget) and Token.AccentPrimary otherwise, so the
tinted background reads as the channel type at a glance. SymbolPicker
runs as an overlay popup — the inserted fragment splices straight into
the pending buffer up to a 500-char cap. Send wiring and the settings
button arrive when the main window assembles the components.
2026-05-23 19:17:25 +02:00
JonKazama-Hellion bdfb1298ad feat(ui): migrate SymbolPicker into the components layer
Lifted out of Ui/ into Ui/Components and registered as a DI singleton so
the new InputBar can consume it via constructor injection. PUA tab still
sources from SeIconChar, BMP tab keeps the server-verified whitelist
verbatim. The old Ui/SymbolPicker.cs stays in place until the cleanup
block removes the v1.5.6 file.
2026-05-23 19:12:18 +02:00
JonKazama-Hellion eb95968750 feat(ui): add MessageList with two-mode virtualisation
Compact mode reuses ImGuiListClipper because rows are a constant line
height; card mode falls back to a linear render with a per-message height
cache and an IsItemVisible skip path so off-screen rows place a Dummy of
the cached height instead of running the full render. Bottom-lock detects
whether the user was pinned to the bottom before the layout pass and
re-pins after new rows land. Renders text-only via SeString.TextValue for
this cycle — full chunk and payload rendering re-attaches later, so the
component shape stays correct without dragging the v1.5.6 chunk pipeline
into the new layer.
2026-05-23 18:53:38 +02:00
JonKazama-Hellion 6ab2e9cece feat(ui): add Sidebar component with width auto-switch
Channel-list panel for the chat window's left side. Auto-switches between
icon-only (38px) and expanded (150px) based on
Config.SidebarAutoSwitchThresholdPx. Each row renders a FontAwesome tab
icon, an expanded-mode name label, a hover-sheen sweep keyed on the tab
identifier, and a pop-out affordance — both the trailing hover button and
the right-click context menu route through a log stub until the channel
popout pool comes online. Glyph table is inlined so the Ui layer carries
its own lookup after the standalone mapping file is removed.
2026-05-23 18:30:29 +02:00
JonKazama-Hellion 0e0c563608 feat(ui): add HonorificHeader component
30px header row pinned to the top of the chat window. Crown always renders
as a brand anchor — even with the Honorific IPC down — while the bracketed
title only appears when CurrentTitle has content. First-frame guard reads
FontManager.FontsReady so layout math never runs against placeholder font
metrics.
2026-05-23 18:17:33 +02:00
JonKazama-Hellion 9c490fa066 feat(services): add TellRouterService stub
Skeleton for the upcoming auto-open routing. Subscribes to
ChatGui.ChatMessageUnhandled and Dispose unsubscribes — when the routing
logic lands, it drops into OnChatMessage without touching the DI graph or
Plugin.cs registration.
2026-05-23 18:12:18 +02:00
JonKazama-Hellion 44c14ace2c feat(fonts): add FontsReady gate property
Returns true once every required atlas-owned handle reports Available.
Components will gate their first-frame draw on this so the layout math
runs against the real atlas rather than placeholder metrics. ItalicFont
null counts as ready because that means italics are disabled in config.
2026-05-23 18:10:36 +02:00
JonKazama-Hellion 53ed154103 feat(config): bump schema to v20 with style-refactor visibility fields
Adds MainWindowOpen, SettingsWindowOpen, MaxParallelPopouts (channel popout
pool size), TellAutoOpenMode (Off/Sidebar/TopTab/Popout) and
SidebarAutoSwitchThresholdPx. Migration is additive — field initializers
fill defaults for v19 configs, the Plugin.cs schema gate bumps the version
stamp after load. UpdateFrom gets explicit sync statements for all five so
settings-save edits do not drop them.
2026-05-23 18:08:34 +02:00
JonKazama-Hellion 620dfe9ea0 feat(themes): bump JSON schema to v2 with typography roundtrip
Loader returns Theme? — null is the silent hard-cut skip for v1 files so
the v2.x refactor stays free of legacy-mapping code. v2 adds an optional
typography{} block with overrideGlobalFontSizePt and overrideSymbolsFontSizePt
slots, both nullable. ThemeRegistry.RefreshCustomCache gets a null guard
so the yield path drops skipped files cleanly. Writer emits typography{}
with explicit nulls so hand-edited files show the available knobs.
2026-05-23 17:38:23 +02:00
JonKazama-Hellion cd9e43c183 feat(style-engine): add DrawListExtensions primitives
Custom-drawing primitives consumed by upcoming components: DrawHoverSheen
with sweep tracking via a static dictionary scoped to constant element-id
keys, DrawGlowBorder using squared-fade layer rects, DrawSlipPolygon as
unsafe stackalloc six-point chamfered polygon, and DrawHonorificHeader for
the crown plus bracketed title. BuildSlipPolygon is internal so the build
suite can pin the geometry without spinning up an ImGui frame.
2026-05-23 17:04:33 +02:00
JonKazama-Hellion b8299a90ca feat(style-engine): add PushStack as ImRaii bridge
DI-singleton that pairs Token lookups with ImRaii's tracked push/pop
machinery. Begin() returns a disposable PushScope with fluent Color, Style
(float/Vector2) and Font methods; reverse-order dispose runs through the
collected IDisposables. Counter-symmetry and exception-safety come from
ImRaii, this layer just handles the token → ImGuiCol resolution and the
RGBA → ABGR conversion at the ImGui boundary.
2026-05-23 16:36:01 +02:00
JonKazama-Hellion d89540de52 feat(style-engine): add TokenResolver and TokenMap
Semantic token layer between code and ThemeColors slots. 41 tokens in three
categories: 24 ImGui-slot tokens with TokenMap mapping to ImGuiCol, 11
custom-drawing tokens that throw on ToImGuiCol, 6 derived surface/text
tokens that lerp from base slots so user picks propagate without inflating
the persisted slot count. Resolver values are RGBA; callers convert at the
ImGui boundary.
2026-05-23 15:59:36 +02:00
JonKazama-Hellion 1d3b429f1b style(format): apply csharpier and markdownlint reflow
Security / scan (push) Successful in 23s
Build / Build (Release) (push) Successful in 31s
Forge Announce / Post changelog to Hellion Forge (push) Successful in 6s
Release / Build and attach release ZIP (push) Successful in 41s
2026-05-23 09:07:01 +02:00
JonKazama-Hellion c640a05a8a Merge branch 'feature/v1.5.6' 2026-05-23 08:59:54 +02:00
JonKazama-Hellion 73a8532e26 release(v1.5.6): rewrite manifest for the settings overhaul 2026-05-23 08:52:18 +02:00
JonKazama-Hellion 32840623ff i18n(settings): translate v1.5.6 first-wave control labels 2026-05-23 08:35:08 +02:00
JonKazama-Hellion 2acac78b4c refactor(settings): retitle data and about cards to match merged scope 2026-05-23 08:28:51 +02:00
JonKazama-Hellion ce4c5d9cf9 i18n(settings): translate new section titles and prune orphan keys 2026-05-23 05:04:47 +02:00
JonKazama-Hellion 4cf7aa5501 refactor(settings): merge integrations into the About tab, finalize seven tabs 2026-05-23 04:11:18 +02:00
JonKazama-Hellion 0da4751b0f refactor(settings): merge privacy into the Data and Privacy tab 2026-05-23 03:20:04 +02:00
JonKazama-Hellion ee39fd0eec refactor(settings): rebuild the per-tab panel into sub-sections 2026-05-23 02:22:55 +02:00
JonKazama-Hellion 78efd654e6 refactor(settings): rebuild the Window tab into three sections 2026-05-23 01:30:41 +02:00
JonKazama-Hellion d3cea8c6c0 refactor(settings): rebuild the Chat tab and pull in tooltips and novice network 2026-05-23 00:57:28 +02:00
JonKazama-Hellion 3058e6bc6d refactor(settings): merge fonts, colours and window style into the Appearance tab 2026-05-23 00:05:49 +02:00
JonKazama-Hellion 8a8c6ccae2 refactor(settings): rebuild the General tab into collapsible sections 2026-05-22 23:07:01 +02:00
JonKazama-Hellion eafa20748c refactor(settings): wire the section-open signal, rename tab files 2026-05-22 22:26:04 +02:00
JonKazama-Hellion b3fc96f424 revert(ui): remove the per-tab regex filter 2026-05-22 21:42:43 +02:00
JonKazama-Hellion a18ac130b3 release(v1.5.6): manifest bump, changelog and forge post 2026-05-22 17:57:01 +02:00
JonKazama-HellionandClaude Sonnet 4.6 c652b102fc feat(ui): add sender name display options
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 17:20:51 +02:00
JonKazama-Hellion ba4cd918da feat(ui): warn before sending plugin-only symbols 2026-05-22 16:41:06 +02:00
JonKazama-Hellion a6e2a75422 feat(ui): add optional regex filter per tab 2026-05-22 15:41:48 +02:00
JonKazama-Hellion d05770fd6d feat(ui): separate opacity for focused and unfocused chat window 2026-05-22 15:03:56 +02:00
JonKazama-Hellion 921dd701c4 feat(audio): add custom sound volume slider 2026-05-22 14:28:22 +02:00
JonKazama-Hellion ba30b1e742 feat(config): bump schema v18 to v19 2026-05-22 14:03:36 +02:00
JonKazama-Hellion 5771573a94 fix(ci): keep bilingual forge-announce embeds from merging
Both the DE and EN embed carried the same release url, which makes
Discord merge url-identical embeds and render only the first embed's
description. The EN block was posted and stored but never shown, so
every auto-announce from v1.4.6 onward displayed German only.

Drop the url from the EN embed so Discord stacks both as separate
cards with both descriptions visible.
2026-05-22 09:56:17 +02:00
JonKazama-Hellion d4bcbc93e2 Merge branch 'feature/v1.5.5'
Security / scan (push) Successful in 23s
Build / Build (Release) (push) Successful in 29s
Forge Announce / Post changelog to Hellion Forge (push) Successful in 6s
Release / Build and attach release ZIP (push) Successful in 36s
2026-05-21 21:27:57 +02:00
JonKazama-Hellion ca801a006a release(v1.5.5): manifest bump, changelog and forge post 2026-05-21 20:43:54 +02:00
JonKazama-Hellion cc1c05add0 feat(ui): add bundled custom notification sounds
Adds three embedded WAV files as additional notification sound choices
(ids 17-19) alongside the existing 16 game sounds. Playback via NAudio
WaveOutEvent/WinMM, which works correctly on Wine/Linux.
2026-05-21 20:07:09 +02:00
JonKazama-Hellion 969d5e6aa6 feat(ui): add a preview button for the per-tab notification sound 2026-05-21 19:01:45 +02:00
JonKazama-Hellion aaeca76bfd fix(branding): enlarge fox banner and add a contrast card 2026-05-21 19:01:42 +02:00
JonKazama-Hellion 4f6c916bd9 feat(branding): replace ASCII fox banner with embedded image 2026-05-21 18:47:25 +02:00
JonKazama-Hellion ce7dda9e48 fix(ui): null-guard agent access and refocus input after token insert
AgentMap.Instance() and AgentChatLog.Instance() can return null during
zone transitions. Capture pointers into locals and short-circuit the
FlagMarkerCount/LinkedItem deref when null so the entries are correctly
greyed out without faulting. Add Activate/ActivatePos after each append
so the input box regains focus and the caret lands after the token,
matching the SymbolPicker and AutoComplete insert paths.
2026-05-21 18:15:12 +02:00
JonKazama-Hellion 80699b27e4 feat(ui): insert map-flag and item-link tokens from chat input 2026-05-21 18:08:49 +02:00
JonKazama-Hellion 3296a12516 style: drop task references from cycle code comments 2026-05-21 14:52:58 +02:00
JonKazama-Hellion 81123ccddf style: apply csharpier formatting to cycle files 2026-05-21 14:46:19 +02:00
JonKazama-Hellion 636a62814f fix(ui): isolate scroll-button state from pop-outs and tidy toolbar
Guard _childScrolledUp writes behind updateScrollState param so pop-out
windows no longer contaminate the main window's scroll state. Widen the
honorific title slot budget when the scroll button is visible, fix stale
comment, and apply csharpier formatting.
2026-05-21 14:43:26 +02:00
JonKazama-Hellion b5aebaad35 fix(ui): keep scroll-to-bottom button on the toolbar row 2026-05-21 14:32:25 +02:00
JonKazama-Hellion bd75f2453c fix(ui): move scroll-to-bottom button into the chat header toolbar
Drop the three-attempt floating overlay entirely. The button now lives in
the chat header toolbar (DrawScrollToBottomToolbarButton), visible only when
the user is scrolled above the live end. Toolbar layout: honorific slot,
scroll button, pop-out button flush-right -- pop-out position unchanged.
2026-05-21 14:22:58 +02:00
JonKazama-Hellion c909d1646b fix(ui): draw scroll-to-bottom button in a standalone overlay window
Button drawn in the parent window over the ##chat2-messages child was never
clickable: ImGui resolves g.HoveredWindow to the child for that screen rect, so
ItemHoverable rejects any item submitted in the parent. A top-level Begin/End
window is a sibling in the window list and wins the hit-test for its own rect.
ownerId parameter keeps the window name distinct between the main window and
each pop-out, preventing Begin/End collisions when both render in the same frame.
2026-05-21 14:10:01 +02:00
JonKazama-Hellion 5781be2e41 feat(ui): pin failed-tell log-message ids and drop discovery logging 2026-05-21 13:46:42 +02:00
JonKazama-Hellion 65fea0e5f5 fix(ui): render scroll-to-bottom button as a parent overlay
The button was drawn inside the ##chat2-messages child via SetCursorPos,
which inflated ContentSize.y / ScrollMaxY each frame (causing positional
drift) and was clipped by the scrollbar's inner clip rect (causing right-
edge cutoff). Move it to the parent window using screen-space coordinates
captured before the child opens; the scroll state is cached inside the
child while GetScrollMaxY/Y still refer to the child's scroll context.
2026-05-21 13:46:42 +02:00
JonKazama-Hellion 3de6e4a3cb feat(ui): add scroll-to-bottom button to the chat log 2026-05-21 13:03:36 +02:00
JonKazama-Hellion e0289962b1 style: remove em-dashes from new code comments 2026-05-21 12:10:17 +02:00
JonKazama-Hellion 95375c8516 feat(ui): auto-focus tab rename and raise buffer to 512 2026-05-21 11:16:53 +02:00