Changed
- WoW path storage unified to base directory. The app now stores and operates
on the WoW root folder (e.g./home/user/Games/world-of-warcraft) everywhere
instead of individual game-version subdirectories. Game-version paths
(_retail_,_classic_, etc.) are derived on demand. This is a single source
of truth and eliminates path inconsistencies across services. - Existing configs that stored game-version paths (e.g.
_retail_) are
automatically migrated to the base path on first load. No manual action required. - Settings dialog now correctly saves a WoW path typed or pasted into the directory
field when clicking Done. Previously only the Browse button updated the config. - Settings Browse dialog now saves a single base path instead of multiple
game-version entries. AddonWriterServicenow writesAppData.luato all installed game versions
under a WoW base directory rather than a single hard-coded version.- All path utility functions consolidated in
tsm/wow/utils.py:
normalize_wow_base,addon_dir,apphelper_dir,appdata_lua_path,
wtf_accounts_dir,installed_versions.
Fixed
- Status bar no longer persistently shows "AppHelper not found" on startup for
users whose WoW install is in config butWoW.exeis absent from_retail_/
(or otherwise not found by the auto-scanner). A race condition at startup caused
WoWDetectorService.scan()to overwrite the config-loaded install list with an
empty result after_resolve_wow_installs()had already populated it.
scan()now leaves the install list unchanged whenset_installs()has already
been called. Closes #3.
UI
- Settings: WoW Directory field now shows a hint label explaining that the base
folder (containing_retail_,_classic_, etc.) must be selected, with a
path example. - Settings: Browse dialog now opens at the currently entered directory instead of
the home folder. - Login: removed redundant subtitle label; dialog tightened to 480x240.
- Login: username placeholder changed from "Username or Email" to "Email".
- Login: HTTP error responses are now mapped to concise user-facing messages
(e.g. 401 → "Invalid email or password.") instead of exposing the raw
exception string with URL and status details. - Login: error label always reserves fixed space in the layout so the dialog
does not shift when an error appears or is cleared. - Log viewer (new): status bar button (between GitHub and Settings) opens a
session log window. Displays all records from the current run in a styled
table with columns Time / Level / Logger / Message, alternating row backgrounds,
and level color-coding (ERROR=red, WARNING=orange). Rows wrap long messages
and all cells are top-aligned. - Log viewer: Copy to Clipboard button copies the full session log as plain text
in the standard log format. Email addresses are automatically redacted before
copying so logs are safe to paste into GitHub issues.