feat(release): 2.0.0 -- nine cycles ship, and the config starts over
v1.6.0 through v1.15.0 were never published. The whole window layer was being rewritten from ImGui defaults to custom drawing, and repo.json deliberately kept its links on v1.5.6 so nobody could update into a half-finished state. That work lands here in one release. The config is not migrated, it is replaced. A config carried across nine cycles of window rebuilds holds values chosen against surfaces that no longer exist, and starting over is the only way to be sure every install is on the same defaults. The message database is a separate file and is not touched. The old config is copied to HellionChat.json.pre-2.0.0.bak first, so rolling back to 1.5.6 stays a file copy rather than an evening of clicking settings back in. Config schema 27. The reset runs from the constructor, before LoadAsync seeds the default tabs, and the self-test now fails if the tab list is empty at /xlperf -- that ordering breaking would leave every user with no tabs and nothing else in the plugin would notice. Default layout gains an Emote tab: custom emotes, standard emotes and echo. A tester asked for it, emotes get lost between system notices otherwise. Manifest, README, roadmap and the four changelog consumers are on 2.0.0. The release notes lead with what was fixed rather than what was redrawn -- retroactive cleanup that could never be applied, a compaction that reported deleting nothing while deleting everything, pinned tell tabs that came up empty for a session. And with the one behaviour change users should know about: the channel grid is authoritative over storage now, so anyone who had unticked channels while the unknown-channel failsafe was on stores less than they did before.
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
<Project Sdk="Dalamud.NET.Sdk/15.0.0">
|
||||
<PropertyGroup>
|
||||
<!-- Independent versioning; see yaml changelog for upstream Chat 2 base -->
|
||||
<Version>1.14.0</Version>
|
||||
<Version>2.0.0</Version>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<!-- Use lock file to pin exact versions -->
|
||||
|
||||
@@ -35,6 +35,39 @@ tags:
|
||||
- Replacement
|
||||
- Privacy
|
||||
changelog: |-
|
||||
**v2.0.0 — Rebuilt, Repaired, Reset (2026-08-19)**
|
||||
|
||||
Nine development cycles in one release. Everything built as v1.6.0 through v1.15.0 ships here; those versions were never published on their own.
|
||||
|
||||
**This update resets your settings.** Nine cycles of rebuilding left saved values pointing at surfaces that no longer exist, and starting over is the only way to be sure every install is on the same defaults. **Your message history is untouched** — it lives in a separate database. Your old settings are kept next to the config file as `HellionChat.json.pre-2.0.0.bak`.
|
||||
|
||||
Fixed, and several of these lost data or hid it:
|
||||
|
||||
- Retroactive cleanup could never be applied at all. The preview took the database lock itself and that counted as a change, so every preview went stale the instant it finished and the apply button never appeared.
|
||||
- Compacting the database ran against an open reader and failed, after which the plugin reported that nothing had been deleted — while everything had.
|
||||
- Deleting messages left them in the search index, so search kept returning rows that were already gone.
|
||||
- Pinned tell tabs came up empty for a whole session: the history query ran at plugin start, before any character is logged in, and never tried again.
|
||||
- Export wrote invalid JSON where a setting value was involved, and a byte-order mark that strict parsers reject.
|
||||
- A pop-out with its title bar switched on could not be closed, and a tell from a popped-out partner hijacked the main window's active tab.
|
||||
- One third-party emote service started returning 403, and that response took all 65 working global emotes down with it on every start.
|
||||
- The GDPR notice for the full-history profile had been translated into 25 languages and shown nowhere since May.
|
||||
|
||||
Changed, and one of these changes what gets stored:
|
||||
|
||||
- **The channel grid is now authoritative.** Until now the unknown-channel failsafe was applied to known channels too, so a channel you had unticked was still being written while that failsafe was on. If that was you, this release stores less than before. Nothing already in the database is touched.
|
||||
- Every window is drawn by the plugin rather than by ImGui defaults, and they share one visual language: structure carried by typography, a surface on anything you can press, and colours measured against what sits behind them.
|
||||
- Typography has named roles — sender, body and timestamp mean the same thing everywhere, timestamps sit in their own column, system messages are italic.
|
||||
- Export, the tab editor, database maintenance and pinning had lost their entry points during the rebuild and are reachable again.
|
||||
- Screenshot mode reached one of four surfaces that draw a tab name. It reaches all four now.
|
||||
|
||||
Removed: six settings that had a control and a saved value but no reader anywhere in the plugin; a per-tab regex filter the game's own blackword filter covers; and a wizard checkbox that was collected, reported as applied and never read.
|
||||
|
||||
New: an Emote tab in the default layout, local and server clocks in the status bar, a screenshot mode reachable from the input row, `/hellion wizard` to reopen the setup wizard, a style lab under `/hellion lab`, and 25 UI languages with the settings window and wizard fully covered.
|
||||
|
||||
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2). The two codebases have diverged far enough that they no longer line up.
|
||||
|
||||
---
|
||||
|
||||
**v1.5.6 — Settings Overhaul + Filter & Notification Polish (2026-05-23)**
|
||||
|
||||
- Settings window reorganised: ten tabs down to seven (General, Appearance, Chat, Window, Channels, Data & Privacy, About). Each tab now uses collapsible sections grouped by control type. Sections start collapsed every time you open a tab — less noise, easier to find what you need.
|
||||
@@ -116,65 +149,4 @@ changelog: |-
|
||||
|
||||
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
|
||||
|
||||
---
|
||||
|
||||
**v1.5.3 — Localisation Wave + Bundled-Font Overhaul (2026-05-19)**
|
||||
|
||||
Multi-language pass plus a long-standing first-frame HITCH lands
|
||||
as a side effect of a font-stack rewrite.
|
||||
|
||||
User-visible:
|
||||
|
||||
- 24 selectable UI languages (was 2). Catalan, Czech, Danish,
|
||||
Dutch, English, Finnish, French, German, Greek, Hungarian,
|
||||
Italian, Japanese, Korean, Norsk bokmål, Polish, Portuguese
|
||||
(BR + PT), Romanian, Russian, Spanish, Swedish, Turkish,
|
||||
Ukrainian, Simplified + Traditional Chinese. Sorted by endonym,
|
||||
"None" pinned first. Non-native locales are AI-assisted and
|
||||
flagged for native-speaker review via the Forge Discord.
|
||||
- Bundled Inter Light replaces Exo 2 (SIL OFL 1.1, 343 KB). The
|
||||
Inter font ships Latin Extended-A/B, Greek polytonic and
|
||||
Cyrillic Supplement coverage; NotoSansCjkRegular joins as a
|
||||
third merge layer for Hangul and Simplified-Han glyphs the
|
||||
FFXIV Japanese game font does not ship.
|
||||
- First-frame HITCH dropped from ~74 ms (v1.5.2 baseline that
|
||||
held since v1.4.x) to a median of ~20 ms (5-reload sample
|
||||
17.9-23.6 ms, Linux/Wine). The bundled-font path silently
|
||||
fell back to the FFXIV Axis font for the entire v1.5.x series
|
||||
because of an early-return in the draw loop. The fix that
|
||||
routes RegularFont through draw also lands the defer-pattern
|
||||
win the v1.5.1 cycle was reaching for.
|
||||
- ExtraGlyphRanges auto-activates on language change. Korean,
|
||||
ChineseFull and the two new flags (LatinExtended, Greek) toggle
|
||||
on without a manual visit to Fonts and Colours.
|
||||
- New WarningText under the language dropdown notes FFXIV's
|
||||
chat input only fully supports EN/DE/FR/JA character sets.
|
||||
Other languages render in HellionChat but may garble when
|
||||
typed into in-game chat.
|
||||
|
||||
Under the hood:
|
||||
|
||||
- Three-layer font stack: Inter Light primary, FFXIV
|
||||
JapaneseFont merge 1 for kana/kanji style, NotoSansCjkRegular
|
||||
merge 2 for everything else CJK.
|
||||
- LanguageOverride enum gains ten locales plus three previously
|
||||
commented out (Italian, Korean, Norwegian as `nb`). New
|
||||
values append to the enum so existing config integers stay
|
||||
stable across update.
|
||||
- Crowdin gap closed: four post-sync ChatTwo keys backfilled
|
||||
into 13 legacy locales with per-key AI markers.
|
||||
- Plugin.LoadAsync runs a one-shot migration that ORs in the
|
||||
matching ExtraGlyphRanges flag for users already on a
|
||||
non-default language. Settings.Apply auto-activates on
|
||||
change going forward.
|
||||
- Em-dash sweep across the EN source and 18 translations to the
|
||||
house style. Russian and Ukrainian keep the typographic norm.
|
||||
|
||||
Migration v17 stays. UseHellionFont users transition from Exo 2
|
||||
to Inter Light transparently on first reload.
|
||||
|
||||
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
|
||||
|
||||
---
|
||||
|
||||
Full history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases
|
||||
Earlier history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases
|
||||
|
||||
@@ -520,6 +520,7 @@ public sealed class Plugin : IAsyncDalamudPlugin
|
||||
{
|
||||
Config.Tabs.Add(TabsUtil.VanillaGeneral);
|
||||
Config.Tabs.Add(TabsUtil.HellionSystem);
|
||||
Config.Tabs.Add(TabsUtil.HellionEmote);
|
||||
Config.Tabs.Add(TabsUtil.HellionFreeCompany);
|
||||
Config.Tabs.Add(TabsUtil.HellionParty);
|
||||
Config.Tabs.Add(TabsUtil.HellionLinkshell);
|
||||
@@ -556,7 +557,7 @@ public sealed class Plugin : IAsyncDalamudPlugin
|
||||
new SelfTests.SettingsWindowOpenStep(this),
|
||||
new SelfTests.OnOpenMainUiRoutesMainWindowStep(this),
|
||||
new SelfTests.TypingIpcStateStep(this),
|
||||
new SelfTests.ConfigMigrationV26Step(this),
|
||||
new SelfTests.ConfigMigrationV27Step(this),
|
||||
new SelfTests.DbGateWiringStep(this),
|
||||
new SelfTests.ChannelPopoutBindStep(this),
|
||||
new SelfTests.HoverStateFootprintStep(),
|
||||
|
||||
@@ -284,6 +284,7 @@ internal class HellionStrings
|
||||
|
||||
// Hellion Chat — Default tab presets (channel-themed)
|
||||
internal static string Tabs_Presets_System => Get(nameof(Tabs_Presets_System));
|
||||
internal static string Tabs_Presets_Emote => Get(nameof(Tabs_Presets_Emote));
|
||||
internal static string Tabs_Presets_FreeCompany => Get(nameof(Tabs_Presets_FreeCompany));
|
||||
internal static string Tabs_Presets_Party => Get(nameof(Tabs_Presets_Party));
|
||||
internal static string Tabs_Presets_Beginner => Get(nameof(Tabs_Presets_Beginner));
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>Sistema</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>Emotes</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>Free Company</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>Systém</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>Emoty</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>Free Company</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>System</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>Emotes</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>Free Company</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>System</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>Emotes</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>Free Company</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>System</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>Emotes</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>Free Company</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>Sistema</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>Emotes</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>Free Company</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>Järjestelmä</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>Emootiot</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>Free Company</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>Système</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>Emotes</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>Compagnie libre</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>Rendszer</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>Emote-ok</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>Free Company</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>Sistema</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>Emote</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>Free Company</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>システム</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>エモート</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>フリーカンパニー</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>시스템</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>감정 표현</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>자유부대</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>System</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>Emotes</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>Free Company</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>Systeem</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>Emotes</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>Free Company</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>System</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>Emoty</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>Free Company</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>Sistema</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>Emotes</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>Free Company</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>Sistema</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>Emotes</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>Free Company</value>
|
||||
</data>
|
||||
|
||||
@@ -604,6 +604,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>System</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>Emotes</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>Free Company</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>System</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>Emotes</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>Free Company</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>Система</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>Эмоции</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>Свободная компания</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>System</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>Emotes</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>Free Company</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>Sistem</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>Emote'lar</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>Free Company</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>Система</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>Емоти</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>Free Company</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>系统</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>情感动作</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>部队</value>
|
||||
</data>
|
||||
|
||||
@@ -611,6 +611,9 @@
|
||||
<data name="Tabs_Presets_System" xml:space="preserve">
|
||||
<value>系統</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_Emote" xml:space="preserve">
|
||||
<value>情感動作</value>
|
||||
</data>
|
||||
<data name="Tabs_Presets_FreeCompany" xml:space="preserve">
|
||||
<value>部隊</value>
|
||||
</data>
|
||||
|
||||
+22
-9
@@ -4,24 +4,37 @@ using Dalamud.Plugin.SelfTest;
|
||||
namespace HellionChat.SelfTests;
|
||||
|
||||
// Pins the post-migration shape of the config. By /xlperf time the schema gate
|
||||
// has already stamped Config.Version and run both migrations, so the fields
|
||||
// below must carry valid values here. This probe never rewrites config; the
|
||||
// migrations themselves are load-time and verified by the prepared-config smoke
|
||||
// in the plan.
|
||||
internal sealed class ConfigMigrationV26Step : ISelfTestStep
|
||||
// has stamped Config.Version and the 2.0.0 reset has run, so the fields below
|
||||
// must carry valid values here. This probe never rewrites config; the reset
|
||||
// itself is load-time.
|
||||
internal sealed class ConfigMigrationV27Step : ISelfTestStep
|
||||
{
|
||||
public ConfigMigrationV26Step(Plugin plugin)
|
||||
public ConfigMigrationV27Step(Plugin plugin)
|
||||
{
|
||||
_ = plugin;
|
||||
}
|
||||
|
||||
public string Name => "Hellion Chat - Config v26 migration";
|
||||
public string Name => "Hellion Chat - Config v27 migration";
|
||||
|
||||
public SelfTestStepResult RunStep()
|
||||
{
|
||||
if (Plugin.Config.Version != 26)
|
||||
if (Plugin.Config.Version != 27)
|
||||
{
|
||||
ImGui.Text($"Config.Version is {Plugin.Config.Version}, expected 26");
|
||||
ImGui.Text($"Config.Version is {Plugin.Config.Version}, expected 27");
|
||||
return SelfTestStepResult.Fail;
|
||||
}
|
||||
|
||||
// v27 replaces the config rather than migrating it, and CreateFresh
|
||||
// hands back an empty tab list. The seeding in LoadAsync is what fills
|
||||
// it, and it runs in a different method than the reset does -- if that
|
||||
// ordering ever breaks, every user comes out of the update with no tabs
|
||||
// at all and nothing else in the plugin would notice.
|
||||
if (Plugin.Config.Tabs.Count == 0)
|
||||
{
|
||||
ImGui.Text(
|
||||
"No tabs at all. The v27 reset empties the list and LoadAsync is what "
|
||||
+ "seeds the presets back -- reaching this point empty means it did not."
|
||||
);
|
||||
return SelfTestStepResult.Fail;
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace HellionChat.Ui;
|
||||
// fields, and CommitPending() applies only the non-null ones so
|
||||
// users who skip a step never get their existing config overwritten.
|
||||
//
|
||||
// This is the first thing a tester ever sees, and until v1.15.0 it was the last
|
||||
// This is the first thing a tester ever sees, and until v2.0.0 it was the last
|
||||
// surface still drawn in ImGui defaults -- stock buttons under a hardcoded
|
||||
// bronze that ignored the theme. It speaks the window's language now: the
|
||||
// settings backdrop, tracked-caps headings, the chamfered accent pill for the
|
||||
@@ -66,7 +66,7 @@ public sealed class FirstRunWizard : Window
|
||||
};
|
||||
}
|
||||
|
||||
// Until v1.15.0 the wizard could only ever open once per session, so its
|
||||
// Until v2.0.0 the wizard could only ever open once per session, so its
|
||||
// state living as long as the plugin never showed. /hellion wizard makes
|
||||
// reopening possible, and a second run that started on step 4 with the
|
||||
// first run's choices still pending would commit picks the user never saw.
|
||||
|
||||
@@ -97,6 +97,21 @@ public static class TabsUtil
|
||||
Channel = InputChannel.NoviceNetwork,
|
||||
};
|
||||
|
||||
// Requested by a tester: emotes have their own rhythm and get lost between
|
||||
// system notices. Echo rides along because /echo is where emote-adjacent
|
||||
// output lands.
|
||||
public static Tab HellionEmote =>
|
||||
new()
|
||||
{
|
||||
Name = HellionStrings.Tabs_Presets_Emote,
|
||||
SelectedChannels = new Dictionary<ChatType, (ChatSource, ChatSource)>
|
||||
{
|
||||
[ChatType.CustomEmote] = (ChatSourceExt.All, ChatSourceExt.All),
|
||||
[ChatType.StandardEmote] = (ChatSourceExt.All, ChatSourceExt.All),
|
||||
[ChatType.Echo] = (ChatSourceExt.All, ChatSourceExt.All),
|
||||
},
|
||||
};
|
||||
|
||||
public static Tab HellionSystem =>
|
||||
new()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user