Files
yaze/docs/internal/plans/ui_modernization.md

57 lines
3.1 KiB
Markdown

# UI Modernization & Architecture Plan
## Overview
This document outlines the standard for UI development in `yaze`, focusing on the transition to a component-based architecture and full utilization of ImGui Docking.
## Core Architecture
### 1. The "Modern Editor" Standard
New editors should follow the pattern established by `DungeonEditorV2`.
**Key Characteristics:**
- **Component-Based**: The Editor class acts as a coordinator. Logic is delegated to specialized components (e.g., `RoomSelector`, `CanvasViewer`).
- **Dependency Injection**: Use `EditorDependencies` struct for passing core systems (`Rom`, `EditorCardRegistry`, `Renderer`).
- **ImGui Docking**: Use `ImGuiWindowClass` to group related windows (e.g., all Dungeon Editor tool windows dock together).
- **No "Mega-Functions"**: Avoid massive `Draw()` methods. Each component handles its own drawing.
### 2. Window Management
- **DockSpace**: The main application DockSpace is managed by `Controller` and `DockSpaceRenderer`.
- **Editor Windows**: Editors should create their own top-level windows using `ImGui::Begin()` with appropriate flags.
- **Card System**: Use `EditorCardRegistry` for auxiliary tool windows (e.g., "Room List", "Object Properties"). This allows users to toggle them via the "View" menu or Sidebar.
### 3. UI Coordinator
`UICoordinator` is the central hub for application-level UI.
- **Responsibilities**:
- Drawing global UI (Command Palette, Welcome Screen, Dialogs).
- Managing global popups.
- coordinating focus between editors.
- **Future Goal**: Move the main DockSpace creation from `Controller` to `UICoordinator` to centralize all UI logic.
## Immediate Improvements (Implemented)
### 1. Fix DockSpace Lifecycle
`Controller::OnLoad` was missing the call to `DockSpaceRenderer::EndEnhancedDockSpace()`. This has been corrected to ensure proper cleanup and potential future post-processing effects.
### 2. Branch Organization
Unstaged changes have been analyzed and a plan for organizing them into feature branches has been created (`docs/internal/plans/branch_organization.md`).
## Future Work
### 1. Centralize Main Window Logic
Move the "DockSpaceWindow" creation from `Controller` to `UICoordinator::BeginFrame()`. This will allow `Controller` to remain agnostic of the specific UI implementation details.
### 2. Standardize Editor Flags
Create a helper method `Editor::BeginWindow(const char* name, bool* p_open, ImGuiWindowFlags flags)` that automatically applies standard flags (like `ImGuiWindowFlags_UnsavedDocument` if dirty).
### 3. Visual Polish
- **Background**: Enhance `DockSpaceRenderer` to support more dynamic backgrounds (currently supports grid/gradient).
- **Theming**: Fully utilize `ThemeManager` for all new components. Avoid hardcoded colors.
## Migration Guide for Legacy Editors
To convert a legacy editor (e.g., `GraphicsEditor`) to the new system:
1. Identify distinct functional areas (e.g., "Tile Viewer", "Palette Selector").
2. Extract these into separate classes/components.
3. Update the main Editor class to initialize and update these components.
4. Register the components as "Cards" in `EditorCardRegistry`.
5. Remove the monolithic `Draw()` method.