backend-infra-engineer: Post v0.3.9-hotfix7 snapshot (build cleanup)

This commit is contained in:
scawful
2025-12-22 00:20:49 +00:00
parent 2934c82b75
commit 5c4cd57ff8
1259 changed files with 239160 additions and 43801 deletions

View File

@@ -0,0 +1,263 @@
# Editor System Refactoring - Complete Summary
**Date:** 2025-11-27
**Status:** ✅ Phase 1 & 2 Complete
**Build Status:** ✅ Full app compiles successfully
## Overview
Completed incremental refactoring of the editor manager and UI system focusing on:
- **Phase 1:** Layout initialization and reset reliability
- **Phase 2:** Sidebar UX improvements and state persistence
## Phase 1: Layout Initialization/Reset
### Objectives
- Fix layout reset not properly rebuilding dockspaces
- Ensure emulator layout initializes correctly
- Add rebuild flag system for deferred layout updates
### Key Changes
**1. RebuildLayout() Method** (`layout_manager.h` + `.cc`)
- Forces layout rebuild even if already initialized
- Validates dockspace exists before building
- Tracks last dockspace ID and editor type
- Duplicates InitializeEditorLayout logic but clears flags first
**2. Rebuild Flag Integration** (`editor_manager.cc`)
- Update() loop checks `IsRebuildRequested()`
- Validates ImGui frame scope before rebuilding
- Determines correct editor type (Emulator or current)
- Auto-clears flag after rebuild
**3. Emulator Layout Trigger** (`editor_manager.cc`)
- `SwitchToEditor(kEmulator)` triggers `InitializeEditorLayout`
- Frame validation ensures ImGui context ready
- Layout built with 7 emulator cards docked properly
**4. Emulator in Sidebar** (`editor_manager.cc`)
- "Emulator" added to active_categories when visible
- Emulator cards appear in sidebar alongside other editors
### Coverage: All 11 Editor Types
| Editor | Build Method | Status |
|--------|--------------|--------|
| Overworld | BuildOverworldLayout | ✅ |
| Dungeon | BuildDungeonLayout | ✅ |
| Graphics | BuildGraphicsLayout | ✅ |
| Palette | BuildPaletteLayout | ✅ |
| Screen | BuildScreenLayout | ✅ |
| Music | BuildMusicLayout | ✅ |
| Sprite | BuildSpriteLayout | ✅ |
| Message | BuildMessageLayout | ✅ |
| Assembly | BuildAssemblyLayout | ✅ |
| Settings | BuildSettingsLayout | ✅ |
| Emulator | BuildEmulatorLayout | ✅ |
## Phase 2: Sidebar UX Improvements
### Issues Addressed
- Sidebar state didn't persist (always started collapsed)
- Expand button in menu bar (inconsistent with collapse button position)
- No visual feedback for active category
- Categories didn't show enabled/disabled state
- Layout offset broken when sidebar collapsed
- Menu bar could overflow with no indication
### Key Changes
**1. State Persistence** (`user_settings.h/cc`, `editor_manager.cc`)
```cpp
// Added to UserSettings::Preferences
bool sidebar_collapsed = false;
bool sidebar_tree_view_mode = true;
std::string sidebar_active_category;
```
- Auto-saves on every toggle/switch via callbacks
- Restored on app startup
**2. Fixed Expand Button** (`editor_card_registry.cc`)
- Collapsed sidebar shows 16px thin strip
- Expand button at same position as collapse button
- Both sidebars (icon + tree) have symmetric behavior
**3. Category Enabled States** (`editor_card_registry.h/cc`)
- Categories requiring ROM grayed out (40% opacity)
- Tooltip: "📁 Open a ROM first | Use File > Open ROM..."
- Emulator always enabled (doesn't require ROM)
- Click disabled category → No action
**4. Enhanced Visual Feedback**
- **Active category:** 4px accent bar, 90% accent button color
- **Inactive category:** 50% opacity, 130% brightness on hover
- **Disabled category:** 30% opacity, minimal hover
- **Rich tooltips:** Icon + name + status + shortcuts
**5. Fixed Layout Offset** (`editor_manager.h`)
```cpp
GetLeftLayoutOffset() {
if (collapsed) return 16.0f; // Reserve strip space
return tree_mode ? 200.0f : 48.0f;
}
```
- Dockspace no longer overlaps collapsed sidebar
- Right panel interaction doesn't break sidebar
**6. Responsive Menu Bar** (`ui_coordinator.cc`)
- Progressive hiding: Version → Session → Dirty
- Notification bell shows hidden elements in tooltip
- Bell always visible as fallback information source
## Architecture Improvements
### Callback System
**Pattern:** User Action → UI Component → Callback → Save Settings
**Callbacks Added:**
```cpp
card_registry_.SetSidebarStateChangedCallback((collapsed, tree_mode) Save);
card_registry_.SetCategoryChangedCallback((category) Save);
card_registry_.SetShowEmulatorCallback(() ShowEmulator);
card_registry_.SetShowSettingsCallback(() ShowSettings);
card_registry_.SetShowCardBrowserCallback(() ShowCardBrowser);
```
### Layout Rebuild Flow
```
Menu "Reset Layout"
→ OnResetWorkspaceLayout() queued as deferred action
→ EditorManager::ResetWorkspaceLayout()
→ ClearInitializationFlags()
→ RequestRebuild()
→ RebuildLayout(type, dockspace_id) // Immediate if in frame
→ Next Update(): Checks rebuild_requested_ flag
→ RebuildLayout() if not done yet
→ ClearRebuildRequest()
```
### Multi-Session Coordination
**Sidebar State:** Global (not per-session)
- UI preference persists across all sessions
- Switching sessions doesn't change sidebar layout
**Categories Shown:** Session-aware
- Active editors contribute categories
- Emulator adds "Emulator" when visible
- Multiple sessions can show different categories
## Files Modified
| File | Phase 1 | Phase 2 | Lines Changed |
|------|---------|---------|---------------|
| layout_manager.h | ✅ | | +15 |
| layout_manager.cc | ✅ | | +132 |
| editor_manager.h | ✅ | ✅ | +8 |
| editor_manager.cc | ✅ | ✅ | +55 |
| editor_card_registry.h | | ✅ | +25 |
| editor_card_registry.cc | | ✅ | +95 |
| user_settings.h | | ✅ | +5 |
| user_settings.cc | | ✅ | +12 |
| ui_coordinator.h | | ✅ | +3 |
| ui_coordinator.cc | | ✅ | +50 |
**Total:** 10 files, ~400 lines of improvements
## Testing Verification
### Compilation
✅ Full app builds successfully (zero errors)
✅ Editor library builds independently
✅ All dependencies resolve correctly
### Integration Points Verified
✅ Layout reset works for all 11 editor types
✅ Emulator layout initializes on first open
✅ Emulator layout resets properly
✅ Sidebar state persists across launches
✅ Sidebar doesn't overlap/conflict with right panel
✅ Category enabled states work correctly
✅ Menu bar responsive behavior functions
✅ Callbacks trigger and save without errors
## User Experience Before/After
### Layout Reset
**Before:**
- Inconsistent - sometimes worked, sometimes didn't
- Emulator layout ignored
- No fallback mechanism
**After:**
- Reliable - uses RebuildLayout() to force reset
- Emulator layout properly handled
- Deferred rebuild if not in valid frame
### Sidebar Interaction
**Before:**
- Always started collapsed
- Expand button in menu bar (far from collapse)
- No visual feedback for active category
- All categories always enabled
- Sidebar disappeared when right panel opened
**After:**
- Starts in saved state (default: expanded, tree view)
- Expand button in same spot as collapse (16px strip)
- 4px accent bar shows active category
- ROM-requiring categories grayed out with helpful tooltips
- Sidebar reserves 16px even when collapsed (no disappearing)
### Menu Bar
**Before:**
- Could overflow with no indication
- All elements always shown regardless of space
**After:**
- Progressive hiding when tight: Version → Session → Dirty
- Hidden elements shown in notification bell tooltip
- Bell always visible as info source
## Known Limitations & Future Work
### Not Implemented (Deferred)
- Sidebar collapse/expand animation
- Category priority/ordering system
- Collapsed sidebar showing vertical category icons
- Dockspace smooth resize on view mode toggle
### Phase 3 Scope (Next)
- Agent chat widget integration improvements
- Proposals panel update notifications
- Unified panel toggle behavior
### Phase 4 Scope (Future)
- ShortcutRegistry as single source of truth
- Shortcut conflict detection
- Visual shortcut cheat sheet
## Summary
**Phase 1 + 2 Together Provide:**
- ✅ Reliable layout management across all editors
- ✅ Professional sidebar UX matching VSCode
- ✅ State persistence for user preferences
- ✅ Clear visual feedback and enabled states
- ✅ Responsive design adapting to space constraints
- ✅ Proper emulator integration throughout
**Architecture Quality:**
- Clean callback architecture for state management
- Proper separation of concerns (UI vs persistence)
- Defensive coding (frame validation, null checks)
- Comprehensive logging for debugging
**Ready for production use and Phase 3 development.**