JARVIS-UI
更新 2.160
2026/6/20
v2.160.0.0MINORJarvis-UI
A–C 階段:ModuleRegistry + Workspace Ready(§17)+ 無飛出選單的圖示欄(§16)(Jarvis-UI)
- A–C 階段的交付
docs/specs/EDITOR_UI_OVERHAUL_PLAN.md§16–§17(Halyson 2026年6月20日之裁決),依據docs/ai/PROMPT_UI_GLM_REMAINING_BACKLOG_2026-06-20.md. 範圍:導覽架構 + 數據驅動型目錄 + 圖示系統 — writers/save bytes/hooks/FfxLib/RT0/RT2/SGM/SPIRA FORGE 未修改;68 個處理常式MenuItem_*未重構(僅被呼叫)。A 階段 — ModuleRegistry(單一來源):ModuleCatalogPolicy.cs從文件存根演變為權威目錄 — 新增public static class ModuleRegistry與IReadOnlyList<ModuleCatalogEntry> All共填入 41 項(主頁 + 10 項核心撰寫 + 5 張地圖 + 7 項直播 + 16 項額外內容 + 2 項第一波內容),每個模組各一項,並依既定流程進行。ModuleCatalogEntry贏得Mode/Notes/Scope/Cluster(enumModuleCluster) 此外,Id/Title/Description/IconKey/RequiresProject原文。各項文字內容的忠實複本SetModule(...)在Main_Window.axaml.cs(未重新制定)。doc-comment 政策:新MenuItem_*已路由 = 追加至登錄檔(審查阻擋項)。A 階段 — 圖標設計:StudioIcons.axaml從 14 → 54 個圖示 擴充至(<StreamGeometry>類似 Lucide 的風格,視口 24×24)—— 每個模組專屬一個隱喻(劍+犄角=怪物、軟碟=存檔、骷髏=敵人設計、六邊形網格=球體網格等)。 一致性檢查(腳本)確認所有 41 個IconKey登錄檔中的 s 解析為StudioIcons. B 階段 — §17 Workspace Ready:MainDashboard_Control.axaml不再有 6 個硬編碼的磁磚,而是變成ItemsControl ItemsSource="{Binding Modules}"與DataTemplate(圖示 + 標題 + 完整說明 + 模式標籤)。Main_DataModel贏得public IReadOnlyList<ModuleCatalogEntry> Modules => ModuleRegistry.All. 兩台全新的轉換器在FFXProjectEditor/Converters/:IconKeyToGeo ometryConverter(resolve string IconKey → Geometry percorrendo資源+合併字典viaTryGetResource(key, ActualThemeVariant, out _)— necessário porque binding{DynamicResource {Binding IconKey}}não funciona paraPathIcon.Dataem Avalonia) e需要已啟用的專案轉換器(IMultiValueConverterRequiresProject × IsProjectLoaded →IsEnabled). Hero + empty-state CTA + card de Workspace status preservados (§17.4). Fase C — §16 Icon Rail sem flyouts: removidos os 5Button.Flyout/下拉式選單doIconRailCol(XAML L156–239) — substituídos por<StackPanel Name="RailStack">populado em code-behind porBuildIconRail()(1 botãorailIconpor entry, agrupado por cluster com邊界1px como separador).Popup#RailDrawer(narrow) troca a lista textual de按鈕 Classes="nav"por<WrapPanel Name="RailDrawerGrid">(grid de ícones). Handler únicoButton_RailModule_Click(sender, e)lê標籤=ID→Dispatch(id).RefreshRailProjectGates()re-aplica o gateRequiresProjectquandoProject_Service.IsProjectLoadedmuda. Fase C — Dispatch genérico:OnQuickLaunchRequested(6 keys hardcoded: monster/kernel/sphere/save/extras/home) substituído porDispatch(string moduleId)com switch de todos os 41 Ids → handlerMenuItem_*existente. Rail, drawer e dashboard passam pelo mesmo caminho. Aceite: build Release 0 erros (402 warnings preexistentes); 0下拉式選單noIconRailCol; 0 tile hardcoded no dashboard; 41 ícones renderizando no rail + 41 cards no home com ícone dedicado + descrição completa; cards desabilitados quandoRequiresProject && !IsProjectLoaded. Bug visual corrigido: os ícones não renderizavam inicialmente porqueApplication.Current.Resources.TryGetValue()em Avalonia 11 não percorre合併字典— fix viaResolveGeometry()helper compartilhado que itera os merged dicts comTryGetResource. [anterior:v2.159.6.1]
v2.160.1.0PATCHJarvis-UI
D1 階段已完成:介面`IRestorableModule` + 重構`NavigationSnapshot` (Jarvis-UI)
- D 階段 的第一個提交 (
docs/ai/PROMPT_GLM_PHASE_D_TO_F_2026-06-20.md§3.D1). 範圍:導覽架構(可還原的「上一頁/下一頁」) — writers/save bytes/hooks/FfxLib/RT0/RT2/SGM/SPIRA FORGE 均未修改。新合約FFXProjectEditor/Modules/Common/IRestorableModule.cs:CaptureState()→Dictionary<string,object?>?(null = 無狀態) 且RestoreState(state)(冪等、對 null 安全)。在 D1 之前,該Main_Window對具體類型進行模式匹配(MonEditorSelector_Control/KernelCommands_Control) 用於擷取狀態——無法擴展至約 38 個模組。現在的Main_Window詢問控制端是否為IRestorableModule. 重構NavigationSnapshot: 轉為record struct (string ModuleId, Dictionary<string,object?>? State); 該枚舉NavigationSurfaceKind已移除。新增欄位private string _currentModuleId = "home"設定於……之初Dispatch(string moduleId).CaptureCurrentNavigationSnapshot()透過一般管道ContentFrame.Content is IRestorableModule;IsSameNavigationSurface()比較一下吧ModuleId;RestoreNavigationSnapshot()做Dispatch(snapshot.ModuleId)+restorable.RestoreState(snapshot.State). 已修正 3 處斷裂的呼叫(仍引用了NavigationSurfaceKind):MenuItem_MonsterMagic1/2(L560/568) →_currentModuleId = "battle-commands-hub"+new NavigationSnapshot("battle-commands-hub")(與MenuItem_Commands/MenuItem_Items(已遷移);NavigateToMonsterEditor(L1549) →new NavigationSnapshot("monster-editor"). 誠實聲明:「上一頁/下一頁」功能在 3 個原始版本(Home/Monster/KernelCommands)中仍可正常運作,但 Monster/KernelCommands 僅能完全還原 當您的控制項實作時IRestorableModule(D2/D4)。在此之前,快照已建立,但State來吧null(返回模組,不還原子選項)。建置發行版 0 個錯誤(402 個既有警告)。[上一頁:v2.160.0.0]
v2.160.2.0PATCHJarvis-UI
D2 階段:`IRestorableModule` 在 7 個簡易編輯器(Jarvis-UI)中
- D 階段 的第二個提交(
docs/ai/PROMPT_GLM_PHASE_D_TO_F_2026-06-20.md§3.D2). 範圍:7 款 Core Authoring 編輯器中可還原的「後退/前進」功能 — writers/save bytes/hooks/FfxLib/RT0/RT2/SGM/SPIRA FORGE 均未修改。實作IRestorableModule(定義於 D1)在 7 個控制組 中:TreasureEditor_Control,AutoAbilityEditor_Control,PlayerGrowthEditor_Control,CtbBaseEditor_Control,KeyItemEditor_Control,FormationEditor_Control,BukiGetTreasureCatalog_Control. 每個CaptureState()擒獲filterText(字串) +selectedIndex(int? 源自集合中選取的項目Displayed*);RestoreState(state)重新套用濾鏡(這會重新套用該ApplyFilter來源OnFilterTextChanged) 並根據索引重新選取該列。編輯器映射: Treasure (SelectedTreasure/DisplayedTreasures), AutoAbility (SelectedAbility/DisplayedAbilities), PlayerGrowth (SelectedCharacter/DisplayedCharacters), CtbBase (SelectedRow/DisplayedRows), KeyItem (SelectedItem/DisplayedItems), 形成 (SelectedBattle/Battles— 不含Displayed*), BukiGetTreasureCatalog (SelectedRow/顯示的列數). **Honestidade:** agora Monster Editor + os 7 editores acima são plenamente restorable via back/forward (voltam pra seleção/filtro exatos). KernelCommands + os hubs (BattleCommands/Items/etc.) viram em D3 (SubTabHub). Build Release **0 erros** (402 warnings preexistentes). [anterior:v2.160.1.0`]
v2.160.3.0PATCHJarvis-UI
D3 階段:`IRestorableModule` 在`SubTabHub_Control` (涵蓋 9 個樞紐)(Jarvis-UI)
- D 階段 的第三次提交(
docs/ai/PROMPT_GLM_PHASE_D_TO_F_2026-06-20.md§3.D3). 適用範圍:所有基座型集線器皆可恢復「上一頁/下一頁」功能 在SubTabHub** — writers/save bytes/hooks/FfxLib/RT0/RT2/SGM/SPIRA FORGE 保持原樣。SubTabHub_Control.axaml.cs實施IRestorableModule: 新欄位int _activeTabIndex追蹤至SelectTab(index);CaptureState()返回{["activeTab"] = _activeTabIndex};RestoreState(state)火焰SelectTab(idx)(通常會重新命名為 pill/active/hosted-content)。9 個樞紐的自動支援: BattleCommandsHub、ItemsHub、SphereGridHub、TextHub、EnemyDesignHub、CustomizationsHub、StatsHub、EncountersHub、Blitzball — 所有樞紐均使用SubTabHub_Control來源AddTab(...), 如此一來,所有使用者都能透過單一變更,免費獲得「活躍子分頁」的還原功能。誠實聲明: 每個子分頁的內部內容(託管編輯器的篩選器/選取範圍)應由託管控制項負責——若該控制項亦實作IRestorableModule(D2 已涵蓋 Treasure/KeyItem/等),該Main_Window隨後執行 restore 指令。Build Release 0 個錯誤(402 個既有警告)。[前一項:v2.160.2.0]
v2.160.4.0PATCHJarvis-UI
D4 階段:`IRestorableModule` 透過預設介面方法(Jarvis-UI)處理所有其餘控制項
- D 階段 的第四次提交(
docs/ai/PROMPT_GLM_PHASE_D_TO_F_2026-06-20.md§3.D4). 適用範圍:在所有*_Control其餘 — writers/save bytes/hooks/FfxLib/RT0/RT2/SGM/SPIRA FORGE 保持原樣。IRestorableModule.cs新增 預設介面方法:CaptureState() => null以及RestoreState(state) { }(預設為無狀態/無操作)。因此,無實質狀態的控制項(唯讀探索器、樞紐、執行時實驗室、除錯、追蹤器、16 項附加功能、Wave-1、子控制項)只需宣告, IRestorableModule在簽名處 — —Main_Window現在可以做了ContentFrame.Content is IRestorableModule在 任何 模組中,不分類型。透過 自動掃描work/_irestable_stateless_sweep_20260620.ps1: 65 項控制項已變更(新增using FFXProjectEditor.Modules.Common;+: UserControl, IRestorableModule),9 個跳過(其中 8 個已在 D1/D2/D3 中實作 +MonsterAiEditor2_Control已停用)。**誠實而言:**這 3 款具備過濾功能的瀏覽器(MagicDllBrowser/RuntimeDllManager/Ps3MagicBrowser)之所以繼承了預設的「無狀態」模式,是因為它們的FilterText它們存在於私有資料模型中,未在控制項中公開 — 篩選器的實際擷取功能則作為較小的待辦事項保留。透過 D1+D2+D3+D4,所有約 72 個控制項 現已宣告IRestorableModule;已參與的(8 位編輯者 + 9 個樞紐)會進行明確的覆寫,其餘則為無狀態。建置發布 0 個錯誤(402 個既有警告)
v2.160.3.0