8ec413e1b9d4511226c5bf9372cb4c77e2ede017
ArenaView carried its own copy of the same five transforms. It differs from the game view in exactly two respects: the arena is a fixed world shown whole, so the tile size is the tighter of the two axis fits rather than the height fit, and there is no scrolling, so the left edge is always 0. That is small enough to absorb into WorldCoordinates as a second named factory. The raw constructor becomes private and both call sites go through scrolling(...) or fitToWorld(...), which also reads better than three positional ints at the call site. ArenaView is threaded the same way GameWorldView was: paintGL builds one snapshot, every draw takes a const WorldCoordinates&, and mousePressEvent takes its own. ArenaView::widgetToWorld guarded against a near-zero tile size; that guard now lives in WorldCoordinates as a tilePx fallback to 1.0, alongside the existing degenerate-world-size fallback, so both factories are total and no conversion can divide by zero. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JcReq7hVk4KUPhTDKWAG7K
Description
No description provided
Languages
C++
96%
CMake
2.2%
Python
1.2%
C
0.6%