diff --git a/.github/forge-posts/v1.4.10.md b/.github/forge-posts/v1.4.10.md new file mode 100644 index 0000000..8053b09 --- /dev/null +++ b/.github/forge-posts/v1.4.10.md @@ -0,0 +1,36 @@ +--- +subtitle: Symbol-Picker und Tell-History Fix +versionsnatur: Feature-Patch + Hotfix +--- + +- Symbol-Picker im Chat-Eingang: ein kleiner Smile-Button links neben + dem Kanal-Indikator öffnet ein Popup mit zwei Tabs. Der erste listet + alle 161 FFXIV-PUA-Glyphen (Dalamuds SeIconChar); der zweite trägt + 97 verifizierte BMP-Symbole (Latin-Marken, Währungen, das ganze + griechische Alphabet, Geometrie, Spielkarten, Noten) — jedes davon + über `/echo` und `/say` in einer vierrundigen Whitelist-Probe + durchgereicht, damit der Channel-Render dem entspricht, was der + Picker anzeigt. Klick fügt das Symbol an der Cursor-Position ein, + Multi-Insert lässt das Popup offen, eine Recent-Used-Leiste zeigt + die letzten sechzehn Picks über beide Tabs. Toggle in Settings → + Chat → Nachrichten-Verhalten, Default an. +- Verlauf in angepinnten Tell-Tabs lädt wieder vollständig: ein + versteckter 500-Zeilen-Scan-Cap in PreloadHistory hat das + User-Setting `AutoTellTabsHistoryPreload` überschrieben, wodurch + weniger-frequente Tell-Partner ihren Backlog verloren haben sobald + die Scan-Schicht mit anderen Chat-Partnern voll lief. Cap ist raus, + der Index auf `(Receiver, Date)` hält die Query schnell. +- Slash-Command-Teardown: /hellion, /hellionView, /hellionDebugger + (und im Debug-Build /hellionSeString) sind als private Felder + gecached. Plugin-Dispose detached die echte Registrierung, statt + mit identischen Args neu zu registrieren — schließt eine latente + Wartungs-Falle aus v1.4.9. +- v1.4.x-Polish-Sweep endet hier. Der ImGuiListClipper-Refactor von + der v1.4.10-Reserve-Liste wurde gecancelt, nachdem der Cross- + Plattform-Smoke gezeigt hat dass das Scroll-Gummi ein Wine/Linux- + Quirk ist — Windows-User haben es nie gesehen. Spike dafür kommt in + einem späteren Patch. Nächster Major-Cycle ist v1.5.0 mit der + DI-Container-Adoption (`Microsoft.Extensions.Hosting` + + `ILogger`) nach dem Lightless-Vorbild. +- Migration v17 unverändert: kein Schema-Bump, kein + Config-Migrations-Aufwand. diff --git a/HellionChat/Ui/ChatLogWindow.cs b/HellionChat/Ui/ChatLogWindow.cs index 0a3136b..ca990aa 100644 --- a/HellionChat/Ui/ChatLogWindow.cs +++ b/HellionChat/Ui/ChatLogWindow.cs @@ -801,10 +801,13 @@ public sealed class ChatLogWindow : Window // picker below would pin the popup under the wrong widget. if (Plugin.Config.SymbolPickerEnabled) { - if (ImGuiUtil.IconButton( + if ( + ImGuiUtil.IconButton( FontAwesomeIcon.Smile, "symbol-picker-trigger", - "Insert symbol or FFXIV icon")) + "Insert symbol or FFXIV icon" + ) + ) { _symbolPicker.OpenPopup(); } diff --git a/HellionChat/Ui/SymbolPicker.cs b/HellionChat/Ui/SymbolPicker.cs index 0d0b28f..bfc426f 100644 --- a/HellionChat/Ui/SymbolPicker.cs +++ b/HellionChat/Ui/SymbolPicker.cs @@ -148,11 +148,14 @@ internal sealed class SymbolPicker foreach (var codepoint in _recentUsed) { var glyph = char.ConvertFromUtf32((int)codepoint); - if (ImGui.Selectable( + if ( + ImGui.Selectable( glyph, false, ImGuiSelectableFlags.DontClosePopups, - new Vector2(20, 20))) + new Vector2(20, 20) + ) + ) { inserted = glyph; } @@ -183,7 +186,12 @@ internal sealed class SymbolPicker if (!tab) return null; - ImGui.InputTextWithHint("##pua-search", "Search by name (e.g. HighQuality)", ref _search, 64); + ImGui.InputTextWithHint( + "##pua-search", + "Search by name (e.g. HighQuality)", + ref _search, + 64 + ); string? inserted = null; @@ -193,19 +201,24 @@ internal sealed class SymbolPicker foreach (var icon in Enum.GetValues()) { var label = icon.ToString(); - if (query.Length > 0 - && label.IndexOf(query, StringComparison.OrdinalIgnoreCase) < 0) + if ( + query.Length > 0 + && label.IndexOf(query, StringComparison.OrdinalIgnoreCase) < 0 + ) { continue; } // ToIconString gives the single-codepoint glyph; tooltip // carries the enum name for discoverability. - if (ImGui.Selectable( + if ( + ImGui.Selectable( icon.ToIconString(), false, ImGuiSelectableFlags.DontClosePopups, - new Vector2(24, 24))) + new Vector2(24, 24) + ) + ) { inserted = icon.ToIconString(); } @@ -243,18 +256,20 @@ internal sealed class SymbolPicker var query = _search; foreach (var (codepoint, name) in BmpWhitelist) { - if (query.Length > 0 - && name.IndexOf(query, StringComparison.OrdinalIgnoreCase) < 0) + if (query.Length > 0 && name.IndexOf(query, StringComparison.OrdinalIgnoreCase) < 0) { continue; } var glyph = char.ConvertFromUtf32((int)codepoint); - if (ImGui.Selectable( + if ( + ImGui.Selectable( glyph, false, ImGuiSelectableFlags.DontClosePopups, - new Vector2(24, 24))) + new Vector2(24, 24) + ) + ) { inserted = glyph; }