SaveState v2.9 - Multi-Selection & Cloud Refinement
This major release introduces flexible multi-selection workflows, a complete structural overhaul for RetroArch core discovery, and critical infrastructure improvements for Google Drive authentication—specifically targeting Linux AppImage and handheld console compatibility.
What's New:
Google Drive Authentication & AppImage Compatibility
- Manual Callback Fallback: Enhanced OAuth authentication robustness by adding a manual callback URL input fallback. If a browser running on an isolated environment or handheld cannot reach the local port (
localhost), users can now manually paste the authorization URL to complete the link. - AppImage Directory Relocation: Credentials and tokens have been moved securely to the user's system app data directory. This resolves write-persistence limitations inherent to the AppImage mounting layer and automatically handles legacy token migration.
- Concurrency & Safety Locks: Implemented a dedicated threading lock to completely block concurrent authentication requests. Improved handling, UI timeout tracking, cancellation hooks, and automatic cleanup of background auth workers.
- Advanced Error Diagnostics: Added a structured tracking property (
last_auth_error) to catch, preserve, and report descriptive troubleshooting logs directly within the interface during connection issues.
Advanced Multi-Selection & Header UI Overhaul
- Tristate Checkbox Headers: Replaced binary select-all buttons with a clean, space-saving tristate checkbox integrated directly into dialog headers. This provides a clear visual indicator for partial, full, or empty multi-selection states across lists.
- Bulk Profile Generation: List widgets for Ares, RetroArch, and generic emulator configurations now utilize
ExtendedSelection. You can select dozens of games simultaneously and batch-import them into active profiles in a single click. - Unified Selection Highlight Engine: Extracted selection styling rules out of local views and into a reusable utility module (
selection_utils.py). All emulator list widgets now apply consistent highlighting behavior driven by a unifiedProfileSelectionDelegate. - Optimized Drag-and-Drop Workflow: Refactored the file dropping routine to gracefully handle multiple shortcuts and game directories at once, skipping duplicate profile names automatically and silencing repetitive alert popups.
Robust RetroArch Save & Core Architecture Parsing
- Unsorted Core Detection: Introduced full support for unstructured environments (
RETROARCH_UNSORTED_CORE_ID), enabling the scanner to accurately map, read, and merge flat save structures residing directly in the root directory rather than within distinct core subfolders. - Expanded Path Discovery: Upgraded configuration tracking (
retroarch.cfg) to look through a much wider sequence of default installation paths on Windows, extending coverage across AppData, LocalAppData, and Microsoft Store deployment footprints. - Max Depth Traversal Safeguards: Replaced generic directory loops with a dedicated recursive explorer (
_iter_files_recursive) governed by strict depth thresholds, calculating exact file distributions and constructing game listings without causing scan loops to hang.
Contributors & Special Thanks
A very special thank you to our community for tracking bugs and expanding platform support:
- @Andered2520 — for isolating and documenting the Google Drive authentication loop on SteamOS (Legion Go 2) running via the AppImage package layout. Your testing on Discord was invaluable for tracing local network limits!