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:
@@ -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.
|
||||||
@@ -801,10 +801,13 @@ public sealed class ChatLogWindow : Window
|
|||||||
// picker below would pin the popup under the wrong widget.
|
// picker below would pin the popup under the wrong widget.
|
||||||
if (Plugin.Config.SymbolPickerEnabled)
|
if (Plugin.Config.SymbolPickerEnabled)
|
||||||
{
|
{
|
||||||
if (ImGuiUtil.IconButton(
|
if (
|
||||||
|
ImGuiUtil.IconButton(
|
||||||
FontAwesomeIcon.Smile,
|
FontAwesomeIcon.Smile,
|
||||||
"symbol-picker-trigger",
|
"symbol-picker-trigger",
|
||||||
"Insert symbol or FFXIV icon"))
|
"Insert symbol or FFXIV icon"
|
||||||
|
)
|
||||||
|
)
|
||||||
{
|
{
|
||||||
_symbolPicker.OpenPopup();
|
_symbolPicker.OpenPopup();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -148,11 +148,14 @@ internal sealed class SymbolPicker
|
|||||||
foreach (var codepoint in _recentUsed)
|
foreach (var codepoint in _recentUsed)
|
||||||
{
|
{
|
||||||
var glyph = char.ConvertFromUtf32((int)codepoint);
|
var glyph = char.ConvertFromUtf32((int)codepoint);
|
||||||
if (ImGui.Selectable(
|
if (
|
||||||
|
ImGui.Selectable(
|
||||||
glyph,
|
glyph,
|
||||||
false,
|
false,
|
||||||
ImGuiSelectableFlags.DontClosePopups,
|
ImGuiSelectableFlags.DontClosePopups,
|
||||||
new Vector2(20, 20)))
|
new Vector2(20, 20)
|
||||||
|
)
|
||||||
|
)
|
||||||
{
|
{
|
||||||
inserted = glyph;
|
inserted = glyph;
|
||||||
}
|
}
|
||||||
@@ -183,7 +186,12 @@ internal sealed class SymbolPicker
|
|||||||
if (!tab)
|
if (!tab)
|
||||||
return null;
|
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;
|
string? inserted = null;
|
||||||
|
|
||||||
@@ -193,19 +201,24 @@ internal sealed class SymbolPicker
|
|||||||
foreach (var icon in Enum.GetValues<SeIconChar>())
|
foreach (var icon in Enum.GetValues<SeIconChar>())
|
||||||
{
|
{
|
||||||
var label = icon.ToString();
|
var label = icon.ToString();
|
||||||
if (query.Length > 0
|
if (
|
||||||
&& label.IndexOf(query, StringComparison.OrdinalIgnoreCase) < 0)
|
query.Length > 0
|
||||||
|
&& label.IndexOf(query, StringComparison.OrdinalIgnoreCase) < 0
|
||||||
|
)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToIconString gives the single-codepoint glyph; tooltip
|
// ToIconString gives the single-codepoint glyph; tooltip
|
||||||
// carries the enum name for discoverability.
|
// carries the enum name for discoverability.
|
||||||
if (ImGui.Selectable(
|
if (
|
||||||
|
ImGui.Selectable(
|
||||||
icon.ToIconString(),
|
icon.ToIconString(),
|
||||||
false,
|
false,
|
||||||
ImGuiSelectableFlags.DontClosePopups,
|
ImGuiSelectableFlags.DontClosePopups,
|
||||||
new Vector2(24, 24)))
|
new Vector2(24, 24)
|
||||||
|
)
|
||||||
|
)
|
||||||
{
|
{
|
||||||
inserted = icon.ToIconString();
|
inserted = icon.ToIconString();
|
||||||
}
|
}
|
||||||
@@ -243,18 +256,20 @@ internal sealed class SymbolPicker
|
|||||||
var query = _search;
|
var query = _search;
|
||||||
foreach (var (codepoint, name) in BmpWhitelist)
|
foreach (var (codepoint, name) in BmpWhitelist)
|
||||||
{
|
{
|
||||||
if (query.Length > 0
|
if (query.Length > 0 && name.IndexOf(query, StringComparison.OrdinalIgnoreCase) < 0)
|
||||||
&& name.IndexOf(query, StringComparison.OrdinalIgnoreCase) < 0)
|
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var glyph = char.ConvertFromUtf32((int)codepoint);
|
var glyph = char.ConvertFromUtf32((int)codepoint);
|
||||||
if (ImGui.Selectable(
|
if (
|
||||||
|
ImGui.Selectable(
|
||||||
glyph,
|
glyph,
|
||||||
false,
|
false,
|
||||||
ImGuiSelectableFlags.DontClosePopups,
|
ImGuiSelectableFlags.DontClosePopups,
|
||||||
new Vector2(24, 24)))
|
new Vector2(24, 24)
|
||||||
|
)
|
||||||
|
)
|
||||||
{
|
{
|
||||||
inserted = glyph;
|
inserted = glyph;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user