JARVIS-UI
Mise à jour 2.160
20/06/2026
v2.160.0.0MINORJarvis-UI
Phases A–C : ModuleRegistry + Workspace Ready (§17) + Icon Rail sans menus déroulants (§16) (Jarvis-UI)
- Livraison des phases A–C de
docs/specs/EDITOR_UI_OVERHAUL_PLAN.md§16–§17 (décisions Halyson du 20 juin 2026), conformément àdocs/ai/PROMPT_UI_GLM_REMAINING_BACKLOG_2026-06-20.md. Portée : architecture de navigation + catalogue basé sur les données + iconographie — writers/save bytes/hooks/FfxLib/RT0/RT2/SGM/SPIRA FORGE inchangés ; les 68 gestionnairesMenuItem_*non refactorisés (simplement appelés). Phase A — ModuleRegistry (source unique) :ModuleCatalogPolicy.csévolue d’un stub documentaire vers un catalogue faisant autorité — nouveaupublic static class ModuleRegistryavecIReadOnlyList<ModuleCatalogEntry> Allcontenant 41 entrées (Home + 10 Core Authoring + 5 Maps + 7 Live + 16 Extras + 2 Wave-1), une par module acheminé via le rail.ModuleCatalogEntryobtientMode/Notes/Scope/Cluster(en plus deModuleCluster) en plus deId/Title/Description/IconKey/RequiresProjectd’origine. Copie fidèle des littéraux de chaqueSetModule(...)dansMain_Window.axaml.cs(non réinventée). Politique relative aux commentaires de documentation : nouveauMenuItem_*routé = ajout dans le registre (bloqueur de révision). Phase A — Iconographie :StudioIcons.axamlétendue de 14 à 54 icônes (<StreamGeometry>de type Lucide, viewBox 24×24) — 1 métaphore dédiée par module (épée + cornes = monstre, disquette = sauvegarde, crâne = design d’ennemi, grille hexagonale = grille sphérique, etc.). Un contrôle de cohérence (script) confirme que les 41IconKeydu registre renvoient bien àStudioIcons. Phase B — §17 Espace de travail prêt :MainDashboard_Control.axamlne comporte plus 6 tuiles codées en dur et devientItemsControl ItemsSource="{Binding Modules}"avecDataTemplate(icône + titre + description complète + bulle de mode).Main_DataModelse voit ajouterpublic IReadOnlyList<ModuleCatalogEntry> Modules => ModuleRegistry.All. Deux nouveaux convertisseurs dansFFXProjectEditor/Converters/:IconKeyToGeo metryConverter(resolve string IconKey → Geometry percorrendoResources+MergedDictionariesviaTryGetResource(key, ActualThemeVariant, out _)— necessário porque binding{DynamicResource {Binding IconKey}}não funciona paraPathIcon.Dataem Avalonia) eRequiresProjectEnabledConverter(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/MenuFlyoutdoIconRailCol(XAML L156–239) — substituídos por<StackPanel Name="RailStack">populado em code-behind porBuildIconRail()(1 botãorailIconpor entry, agrupado por cluster comBorder1px como separador).Popup#RailDrawer(narrow) troca a lista textual deButton Classes="nav"por<WrapPanel Name="RailDrawerGrid">(grid de ícones). Handler únicoButton_RailModule_Click(sender, e)lêTag=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); 0MenuFlyoutnoIconRailCol; 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 percorreMergedDictionaries— fix viaResolveGeometry()helper compartilhado que itera os merged dicts comTryGetResource. [anterior:v2.159.6.1]
v2.160.1.0PATCHJarvis-UI
Phase D1 terminée : interface `IRestorableModule` + refactorisation `NavigationSnapshot` (Jarvis-UI)
- Premier commit de la phase D (
docs/ai/PROMPT_GLM_PHASE_D_TO_F_2026-06-20.md§3.D1). Portée : architecture de navigation (retour/suivant restaurables) — writers/save bytes/hooks/FfxLib/RT0/RT2/SGM/SPIRA FORGE inchangés. Nouveau contratFFXProjectEditor/Modules/Common/IRestorableModule.cs:CaptureState()→Dictionary<string,object?>?(null = sans état) etRestoreState(state)(idempotent, sans danger avec null). Avant la version D1,Main_Windoweffectuait une correspondance de motifs sur des types concrets (MonEditorSelector_Control/KernelCommands_Control) pour capturer l’état — cela ne s’adapte pas à environ 38 modules. Désormais, leMain_Windowdemande au contrôle s’il estIRestorableModule. RefactorisationNavigationSnapshot: devientrecord struct (string ModuleId, Dictionary<string,object?>? State); l'énumérationNavigationSurfaceKindest supprimée. Nouveau champprivate string _currentModuleId = "home"défini au début deDispatch(string moduleId).CaptureCurrentNavigationSnapshot()générique viaContentFrame.Content is IRestorableModule;IsSameNavigationSurface()ne compare queModuleId;RestoreNavigationSnapshot()effectueDispatch(snapshot.ModuleId)+restorable.RestoreState(snapshot.State). 3 appels erronés corrigés (qui faisaient encore référence àNavigationSurfaceKind) :MenuItem_MonsterMagic1/2(L560/568) →_currentModuleId = "battle-commands-hub"+new NavigationSnapshot("battle-commands-hub")(même modèle que lesMenuItem_Commands/MenuItem_Itemsdéjà migrés) ;NavigateToMonsterEditor(L1549) →new NavigationSnapshot("monster-editor"). En toute honnêteté : les boutons « Précédent » et « Suivant » continuent de fonctionner dans les 3 versions d'origine (Home/Monster/KernelCommands), mais Monster/KernelCommands ne seront entièrement restaurables lorsque vos commandes mettront en œuvreIRestorableModule(D2/D4). En attendant, l'instantané est créé, mais leStatese transforme ennull(retour au module, ne restaure pas la sous-sélection). Build Release 0 erreur (402 avertissements préexistants). [précédent :v2.160.0.0]
v2.160.2.0PATCHJarvis-UI
Phase D2 : `IRestorableModule` sur les 7 éditeurs simples (Jarvis-UI)
- Deuxième commit de la phase D (
docs/ai/PROMPT_GLM_PHASE_D_TO_F_2026-06-20.md§3.D2). Portée : fonctions « retour » et « avance » restaurables dans 7 éditeurs Core Authoring — writers/save bytes/hooks/FfxLib/RT0/RT2/SGM/SPIRA FORGE inchangés. ImplémenteIRestorableModule(défini en D1) dans 7 contrôles :TreasureEditor_Control,AutoAbilityEditor_Control,PlayerGrowthEditor_Control,CtbBaseEditor_Control,KeyItemEditor_Control,FormationEditor_Control,BukiGetTreasureCatalog_Control. ChaqueCaptureState()capturefilterText(chaîne) +selectedIndex(entier ? dérivé de l'élément sélectionné dans la collectionDisplayed*);RestoreState(state)réinitialise le filtre (qui réapplique leApplyFilterviaOnFilterTextChanged) et resélectionne la ligne par son index. Mappage par l'éditeur : Treasure (SelectedTreasure/DisplayedTreasures), AutoAbility (SelectedAbility/DisplayedAbilities), PlayerGrowth (SelectedCharacter/DisplayedCharacters), CtbBase (SelectedRow/DisplayedRows), KeyItem (SelectedItem/DisplayedItems), Formation (SelectedBattle/Battles— sansDisplayed*), BukiGetTreasureCatalog (SelectedRow/DisplayedRows). 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
Phase D3 : `IRestorableModule` dans `SubTabHub_Control` (couvre 9 hubs) (Jarvis-UI)
- Troisième commit de la phase D (
docs/ai/PROMPT_GLM_PHASE_D_TO_F_2026-06-20.md§3.D3). Portée : fonctions « retour » et « suivant » restaurables dans tous les hubs basés sur dansSubTabHub— writers/save bytes/hooks/FfxLib/RT0/RT2/SGM/SPIRA FORGE inchangés.SubTabHub_Control.axaml.csimplémenteIRestorableModule: nouveau champint _activeTabIndexsuivi dansSelectTab(index);CaptureState()renvoie{["activeTab"] = _activeTabIndex};RestoreState(state)appelleSelectTab(idx)(qui ré-appelle pill/active/hosted-content normalement). Couverture automatique des 9 hubs : BattleCommandsHub, ItemsHub, SphereGridHub, TextHub, EnemyDesignHub, CustomizationsHub, StatsHub, EncountersHub, Blitzball — tous utilisentSubTabHub_ControlviaAddTab(...), ce qui leur permet à tous de bénéficier gratuitement de la restauration de l'onglet actif en une seule modification. Remarque : le contenu interne de chaque sous-onglet (filtre/sélection de l’éditeur hébergé) relève de la responsabilité du contrôle hébergé — s’il implémente égalementIRestorableModule(D2 a pris en charge Treasure/KeyItem/etc.), leMain_Windowenchaîne la restauration dans la séquence. Build Release 0 erreur (402 avertissements préexistants). [précédent :v2.160.2.0]
v2.160.4.0PATCHJarvis-UI
Phase D4 : `IRestorableModule` sur tous les contrôles restants via les méthodes d'interface par défaut (Jarvis-UI)
- Quatrième commit de la phase D (
docs/ai/PROMPT_GLM_PHASE_D_TO_F_2026-06-20.md§3.D4). Portée : déclarer l'interface sur tous les*_Controlrestants — writers/save bytes/hooks/FfxLib/RT0/RT2/SGM/SPIRA FORGE inchangés.IRestorableModule.csse voit attribuer des méthodes d'interface par défaut :CaptureState() => nulletRestoreState(state) { }(sans état/sans opération par défaut). Ainsi, les contrôles sans état significatif (explorateurs en lecture seule, hubs, laboratoires d'exécution, débogage, trackers, 16 Extras, Wave-1, sous-contrôles) n'ont qu'à déclarer, IRestorableModuledans la signature — leMain_Windowpeut désormais effectuer unContentFrame.Content is IRestorableModuledans n'importe quel module sans distinction de type. Balayage automatisé viawork/_irestable_stateless_sweep_20260620.ps1: 65 contrôles modifiés (ajouteusing FFXProjectEditor.Modules.Common;+: UserControl, IRestorableModule), 9 ignorés (les 8 déjà implémentés dans D1/D2/D3 +MonsterAiEditor2_Controlabandonné). En toute honnêteté : les 3 navigateurs avec filtre (MagicDllBrowser/RuntimeDllManager/Ps3MagicBrowser) ont hérité du comportement par défaut « stateless » car leursFilterTextrésident dans des DataModels privés, non exposés dans le contrôle — la capture réelle du filtre reste une tâche mineure en attente. Avec D1+D2+D3+D4, les quelque 72 contrôles déclarent désormaisIRestorableModule; ceux qui en disposaient (8 éditeurs + 9 hubs) effectuent une redéfinition explicite, les autres sont sans état. Build de version 0 erreur (402 avertissements préexistants)
v2.160.3.0