243 lines
7.9 KiB
Markdown
243 lines
7.9 KiB
Markdown
# Sidebar UX Improvements - Phase 2 Implementation
|
|
|
|
**Date:** 2025-11-27
|
|
**Status:** ✅ Complete
|
|
**Build Status:** ✅ Compiles successfully
|
|
|
|
## Overview
|
|
|
|
Phase 2 improves sidebar UX based on user feedback:
|
|
- Sidebar state now persists across sessions
|
|
- Enhanced tooltips with better color coordination
|
|
- Improved category switching visual feedback
|
|
- Responsive menu bar that auto-hides elements when space is tight
|
|
- View mode switching properly saves state
|
|
|
|
## Changes Implemented
|
|
|
|
### 1. Sidebar State Persistence
|
|
|
|
**Files Modified:**
|
|
- `src/app/editor/system/user_settings.h`
|
|
- `src/app/editor/system/user_settings.cc`
|
|
- `src/app/editor/editor_manager.cc`
|
|
|
|
**Added to UserSettings::Preferences:**
|
|
```cpp
|
|
// Sidebar State
|
|
bool sidebar_collapsed = false; // Start expanded by default
|
|
bool sidebar_tree_view_mode = true; // Start in tree view mode
|
|
std::string sidebar_active_category; // Last active category
|
|
```
|
|
|
|
**Persistence Flow:**
|
|
1. Settings loaded on startup → Applied to `card_registry_`
|
|
2. User toggles sidebar/mode → Callback triggers → Settings saved
|
|
3. Next launch → Sidebar restores previous state
|
|
|
|
**Implementation:**
|
|
- `EditorManager::Initialize()` applies saved state after loading settings
|
|
- Callbacks registered for state changes:
|
|
- `SetSidebarStateChangedCallback` - Saves on collapse/mode toggle
|
|
- `SetCategoryChangedCallback` - Saves on category switch
|
|
|
|
### 2. Enhanced Visual Feedback
|
|
|
|
**File:** `src/app/editor/system/editor_card_registry.cc`
|
|
|
|
**Category Buttons (lines 604-672):**
|
|
- **Active category:** Wider indicator bar (4px vs 2px), brighter accent color
|
|
- **Inactive categories:** Subtle background with clear hover state
|
|
- **Tooltips:** Rich formatting with icon, editor name, status, instructions
|
|
|
|
**Before:**
|
|
```
|
|
[Icon] → Tooltip: "Overworld Editor\nClick to switch"
|
|
```
|
|
|
|
**After:**
|
|
```
|
|
[Icon with glow] → Enhanced Tooltip:
|
|
🗺 Overworld Editor
|
|
────────────────
|
|
Click to switch to Overworld view
|
|
✓ Currently Active
|
|
```
|
|
|
|
**Card Buttons (lines 786-848):**
|
|
- **Active cards:** Accent color with "Visible" indicator in tooltip
|
|
- **Disabled cards:** Warning color with clear disabled reason
|
|
- **Tooltips:** Icon + name + shortcut + visibility status
|
|
|
|
### 3. Category Switching Improvements
|
|
|
|
**File:** `src/app/editor/system/editor_card_registry.cc`
|
|
|
|
**Visual Enhancements:**
|
|
- Active indicator bar: 4px width (was 2px) with no rounding for crisp edge
|
|
- Active button: 90% opacity accent color with 100% on hover
|
|
- Inactive button: 50% opacity with 1.3x brightness on hover
|
|
- Clear visual hierarchy between active and inactive states
|
|
|
|
**Callback System:**
|
|
```cpp
|
|
SetCategoryChangedCallback([this](const std::string& category) {
|
|
user_settings_.prefs().sidebar_active_category = category;
|
|
user_settings_.Save();
|
|
});
|
|
```
|
|
|
|
### 4. View Mode Toggle Enhancements
|
|
|
|
**File:** `src/app/editor/system/editor_card_registry.h` + `.cc`
|
|
|
|
**Added Callbacks:**
|
|
- `SetSidebarStateChangedCallback(std::function<void(bool, bool)>)`
|
|
- Triggered on collapse toggle, tree/icon mode switch
|
|
- Passes (collapsed, tree_mode) to callback
|
|
|
|
**Icon View Additions:**
|
|
- Added "Tree View" button (ICON_MD_VIEW_LIST) above collapse button
|
|
- Triggers state change callback for persistence
|
|
- Symmetric with tree view's "Icon Mode" button
|
|
|
|
**Tree View Additions:**
|
|
- Enhanced "Icon Mode" button with state change callback
|
|
- Tooltip shows "Switch to compact icon sidebar"
|
|
|
|
### 5. Responsive Menu Bar
|
|
|
|
**File:** `src/app/editor/ui/ui_coordinator.cc`
|
|
|
|
**Progressive Hiding Strategy:**
|
|
```
|
|
Priority (highest to lowest):
|
|
1. Panel Toggles (always visible, fixed position)
|
|
2. Notification Bell (always visible)
|
|
3. Dirty Indicator (hide only if extremely tight)
|
|
4. Session Button (hide if medium tight)
|
|
5. Version Text (hide first when tight)
|
|
```
|
|
|
|
**Enhanced Tooltip:**
|
|
When menu bar items are hidden, the notification bell tooltip shows:
|
|
- Notifications (always)
|
|
- Hidden dirty status (if applicable): "● Unsaved changes: zelda3.sfc"
|
|
- Hidden session count (if applicable): "📋 3 sessions active"
|
|
|
|
**Space Calculation:**
|
|
```cpp
|
|
// Calculate available width between menu items and panel toggles
|
|
float available_width = panel_region_start - menu_items_end - padding;
|
|
|
|
// Progressive fitting (highest to lowest priority)
|
|
bool show_version = (width needed) <= available_width;
|
|
bool show_session = has_sessions && (width needed) <= available_width;
|
|
bool show_dirty = has_dirty && (width needed) <= available_width;
|
|
```
|
|
|
|
## User Experience Improvements
|
|
|
|
### Before Phase 2
|
|
- ❌ Sidebar forgot state on restart (always started collapsed)
|
|
- ❌ Category tooltips were basic ("Overworld Editor\nClick to switch")
|
|
- ❌ Active category not visually obvious
|
|
- ❌ Switching between tree/icon mode didn't save preference
|
|
- ❌ Menu bar could overflow with no indication of hidden elements
|
|
|
|
### After Phase 2
|
|
- ✅ Sidebar remembers collapse/expand state
|
|
- ✅ Sidebar remembers tree vs icon view mode
|
|
- ✅ Sidebar remembers last active category
|
|
- ✅ Rich tooltips with icons, status, and instructions
|
|
- ✅ Clear visual distinction between active/inactive categories (4px bar, brighter colors)
|
|
- ✅ Menu bar auto-hides elements gracefully when space is tight
|
|
- ✅ Hidden menu bar items shown in notification bell tooltip
|
|
|
|
## Technical Details
|
|
|
|
### Callback Architecture
|
|
|
|
**State Change Flow:**
|
|
```
|
|
User Action → UI Component → Callback → EditorManager → UserSettings.Save()
|
|
```
|
|
|
|
**Example: Toggle Sidebar**
|
|
```
|
|
1. User clicks collapse button in sidebar
|
|
2. EditorCardRegistry::ToggleSidebarCollapsed()
|
|
→ sidebar_collapsed_ = !sidebar_collapsed_
|
|
→ on_sidebar_state_changed_(collapsed, tree_mode)
|
|
3. EditorManager callback executes:
|
|
→ user_settings_.prefs().sidebar_collapsed = collapsed
|
|
→ user_settings_.prefs().sidebar_tree_view_mode = tree_mode
|
|
→ user_settings_.Save()
|
|
```
|
|
|
|
### Session Coordination
|
|
|
|
The sidebar state is **global** (not per-session) because:
|
|
- UI preference should persist across all work
|
|
- Switching sessions shouldn't change sidebar layout
|
|
- User expects consistent UI regardless of active session
|
|
|
|
Categories shown **are session-aware:**
|
|
- Active editors determine available categories
|
|
- Emulator adds "Emulator" category when visible
|
|
- Multiple sessions can contribute different categories
|
|
|
|
### Menu Bar Responsive Behavior
|
|
|
|
**Breakpoints:**
|
|
- **Wide (>800px):** All elements visible
|
|
- **Medium (600-800px):** Version hidden
|
|
- **Narrow (400-600px):** Version + Session hidden
|
|
- **Tight (<400px):** Version + Session + Dirty hidden
|
|
|
|
**Always Visible:**
|
|
- Panel toggle buttons (fixed screen position)
|
|
- Notification bell (last status element)
|
|
|
|
## Verification
|
|
|
|
✅ **Compilation:** Builds successfully with no errors
|
|
✅ **State Persistence:** Sidebar state saved to `yaze_settings.ini`
|
|
✅ **Visual Consistency:** Tooltips match welcome screen / editor selection styling
|
|
✅ **Responsive Layout:** Menu bar gracefully hides elements when tight
|
|
✅ **Callback Integration:** All state changes trigger saves automatically
|
|
|
|
## Example: Settings File
|
|
|
|
```ini
|
|
# Sidebar State (new in Phase 2)
|
|
sidebar_collapsed=0
|
|
sidebar_tree_view_mode=1
|
|
sidebar_active_category=Overworld
|
|
```
|
|
|
|
## Known Limitations
|
|
|
|
- No animation for sidebar expand/collapse (deferred to future)
|
|
- Category priority system not yet implemented (categories shown in registration order)
|
|
- Collapsed sidebar strip UI not yet implemented (would show vertical category icons)
|
|
|
|
## Next Steps (Phase 3 - Agent/Panel Integration)
|
|
|
|
As outlined in the plan:
|
|
1. Unified panel toggle behavior across keyboard/menu/buttons
|
|
2. Agent chat widget integration improvements
|
|
3. Proposals panel update notifications
|
|
|
|
## Summary
|
|
|
|
✅ All Phase 2 objectives completed:
|
|
- Sidebar state persists across sessions
|
|
- Enhanced tooltips with rich formatting and color coordination
|
|
- Improved category switching with clearer visual feedback
|
|
- Responsive menu bar with progressive hiding
|
|
- View mode toggle with proper callbacks and state saving
|
|
|
|
The sidebar now provides a consistent, VSCode-like experience with state persistence and clear visual feedback.
|
|
|