docs: add v1.4.10 forge announcement post and apply csharpier reflow

Forge-Post is required in the tagged tree so forge-announce.yml can read
it during the release-pipeline run. Plus a csharpier reflow on two files
(SymbolPicker.cs, ChatLogWindow.cs) that preflight Block E flagged after
the cycle's comment-tightening sweep — purely whitespace, no behaviour
change.
This commit is contained in:
2026-05-16 14:01:17 +02:00
parent 3e91177833
commit 667950c98e
3 changed files with 67 additions and 13 deletions
+36
View File
@@ -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<T>`) nach dem Lightless-Vorbild.
- Migration v17 unverändert: kein Schema-Bump, kein
Config-Migrations-Aufwand.
+5 -2
View File
@@ -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();
}
+26 -11
View File
@@ -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<SeIconChar>())
{
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;
}