Activity Bar Improvements:
- Draggable: Grab left handle to move anywhere on screen
- Resizable: Grab right handle to change width (400-1600px)
- Background Opacity: Now actually works (20-100%)
- Search toggle: Right-click menu to show/hide search box
- Clock toggle: Right-click menu to show/hide clock
- Reset Position: Right-click menu to reset to default position
- Settings dialog: Added opacity slider, width, search/clock toggles
Config additions:
- x, y: Custom position
- width: Bar width (400-1600)
- background_opacity: 20-100%
- show_search: Toggle search visibility
- show_clock: Toggle clock visibility
Bug Fixes:
- OverlayController now inherits QObject (fixes 'cannot be converted' error)
- Activity bar saves position when dragged
- Activity bar saves width when resized
Hotkey Changes:
- Ctrl+Shift+U: Now toggles Activity Bar (in-game overlay) instead of dashboard
- Ctrl+Shift+H: Still hides all overlays
- Ctrl+Shift+B: Also toggles Activity Bar (kept for compatibility)
UI Updates:
- Tray menu shows 'Activity Bar (Ctrl+Shift+U)' to indicate hotkey
- Dashboard no longer has a global hotkey (use tray icon or window)
- Updated startup messages to reflect new hotkey setup
Changes:
- Default mode now OVERLAY_GAME_FOCUSED (Blish HUD style)
- Activity bar ONLY shows when EU window is focused
- Completely hidden on desktop and other windows
- Non-blocking focus detection with QTimer.singleShot
- Auto-disables if window detection is too slow (>500ms)
- Added Overlay Mode dropdown in Settings > General
- Options: Game Focused, Always Visible, Hotkey Toggle, Temporary, Desktop Only
Settings:
- activity_bar.overlay_mode: 'overlay_game' (default)
- Game Focused: Overlay strictly tied to EU window focus
New OverlayController (core/overlay_controller.py):
- DESKTOP_APP: Activity bar only in desktop app
- OVERLAY_ALWAYS: Always visible as overlay
- OVERLAY_GAME_FOCUSED: Only when EU game window focused
- OVERLAY_HOTKEY_TOGGLE: Toggle with Ctrl+Shift+B (default)
- OVERLAY_TEMPORARY: Show 8 seconds on hotkey, then auto-hide
Changes:
- Activity bar now controlled by OverlayController
- Removed old _start_eu_focus_detection/_check_eu_focus methods
- Updated quit() to stop overlay controller
- Startup messages show current mode
Settings key: activity_bar.overlay_mode
Default: overlay_toggle
Changes:
- Fixed is_focused property (was calling as method)
- EU focus detection now DISABLED by default
- Added auto_show_on_focus setting (default: false)
- Hard disable if focus check takes >1 second
- ActivityBarConfig now includes auto_show_on_focus setting
This prevents the EnumWindows blocking that was causing 4.5s freezes.
Users can manually enable in settings if they want auto-show behavior.
Problem: EnumWindows was iterating through ALL windows on system
when EU wasn't running, causing 4.5s blocking delays every 5s.
Changes:
- _find_window_by_title: 100ms timeout, 500 window limit
- _find_window_by_process: 150ms timeout, 300 window limit
- Skip empty window titles (performance)
- Slow down focus detection to 60s when EU not found 3x
This should eliminate the 2s menu + 7s click delays.
- New debug_logger.py with timing and stack trace capabilities
- Tray icon now logs all interactions with millisecond timing
- Main app startup is fully instrumented
- EU focus detection logs and warns if slow (>100ms)
- Menu interactions use QTimer.singleShot to avoid blocking
- Log file saved to Documents/Entropia Universe/Logs/
This will help identify the source of UI slowness (2s menu delay, 7s click delay)
1. System Tray Icon (replaces floating button):
- Right-click menu with: Dashboard, Activity Bar, Settings, Quit
- Orange 'EU' icon
- Double-click to open dashboard
- Notifications support
2. Removed Floating Icon:
- No more floating button on desktop
- All interaction through tray icon
3. EU Window Focus Detection:
- Activity bar auto-shows when EU is focused
- Activity bar auto-hides when EU loses focus
- Checks every 500ms for focus changes
- Tray icon checkbox reflects activity bar state
New Files:
- core/tray_icon.py: System tray implementation
Modified:
- core/main.py: Use tray instead of floating icon, add focus detection
Usage:
- Start EU-Utility: Tray icon appears in system tray
- Open EU game: Activity bar appears automatically
- Alt-tab away from EU: Activity bar hides
- Right-click tray icon: Access settings, toggle bar, quit
NEW: core/api/ directory with comprehensive three-tier API
PluginAPI (core/api/plugin_api.py):
- 12 core service integrations (Log, Window, OCR, Screenshot, Nexus, HTTP, Audio, Notifications, Clipboard, Event Bus, Data Store, Tasks)
- Full docstrings with examples for every method
- Thread-safe design with Qt signal marshaling
- Proper error handling with custom exceptions
- Service availability checking
WidgetAPI (core/api/widget_api.py):
- Widget creation and management
- WidgetConfig dataclass for configuration
- WidgetType enum (MINI, CONTROL, CHART, ALERT, CUSTOM)
- WidgetAnchor enum for positioning
- Event system (moved, resized, closing, closed, update)
- Layout helpers (grid, horizontal, vertical, cascade)
- Persistence (save/load widget states)
- Widget presets for reuse
ExternalAPI (core/api/external_api.py):
- REST API server with aiohttp
- API endpoint registration (decorator and programmatic)
- Incoming webhooks with HMAC verification
- Outgoing webhook POST support
- API key authentication
- IPC (inter-process communication)
- File watcher for config changes
- Server-Sent Events (SSE) support
- CORS configuration
- Webhook history tracking
core/api/__init__.py:
- Unified imports for all three APIs
- Version tracking (2.2.0)
- Clean namespace exports
docs/API_REFERENCE.md:
- Comprehensive 12,000+ word reference
- Quick start examples for each API
- Service-by-service documentation
- Error handling guide
- Integration examples (Discord, custom widget)
Integration:
- Updated core/main.py to import from new API structure
- All three APIs available via: from core.api import get_api, get_widget_api, get_external_api
Benefits:
- Clear separation of concerns (plugins vs widgets vs external)
- Well-documented APIs for developers
- Easy to extend with new services
- Type hints throughout
- Production-ready error handling
- Third-party integration support out of the box
- Added Ctrl+Shift+B hotkey to toggle activity bar visibility
- Added _on_activity_bar_hotkey() handler method
- Updated startup messages to show all hotkeys including activity bar
Hotkeys:
- Ctrl+Shift+U: Toggle main overlay
- Ctrl+Shift+H: Hide all overlays
- Ctrl+Shift+B: Toggle activity bar
NEW: core/activity_bar.py
- ActivityBar class for in-game overlay
- Configurable layouts: Horizontal, Vertical, Grid
- Pinned plugins in bar
- Plugin drawer (app drawer style)
- Draggable, resizable
- Opacity and size controls
- Auto-hide feature
- Settings dialog
Features:
- Horizontal/Vertical/Grid layouts
- Adjustable icon size (32-96px)
- Opacity slider (20-100%)
- Auto-hide when not in use
- Plugin drawer with all enabled plugins
- Click plugin to open mini widget or full UI
- Drag to reposition anywhere on screen
INTEGRATION:
- Added to core/main.py
- Auto-created on startup if enabled
- Toggle with Ctrl+Shift+B (configurable)
- Integrated with plugin manager
Usage:
- Install plugins
- They appear in Activity Bar (if pinned) or Drawer
- Click to open mini widget or full UI
- Right-click for settings
This provides a macOS-style dock experience for in-game use,
while keeping the desktop app for configuration.