1748be57fbd04d2afe4dc0329f7f9dbe8f8d1b64
First slice of pulling key handling out of GameWorldView. The widget no longer holds A/D key state; the mapper owns it and publishes the resulting direction as PanDirectionChangedEvent, which the view consumes like any other event. The event is level-triggered on purpose — the payload is the complete current direction, PanDirection::None included — so a receiver never reconstructs state from edges and cannot be left panning by a missing key-up. It is also the one place in the UI where caching an event payload is right rather than wrong: input has no other authority to re-read from, so the mapper is the source of truth. Both points are written down on the event, since they look like violations of the surrounding conventions otherwise. Holding the state in one object is what makes releaseAll() possible; restart uses it, and it is what a focusOutEvent will call to fix the stuck-pan bug in a follow-up. Bindings stay hard-coded. Only the ownership moved, so behaviour is unchanged, including both keys held cancelling out. 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%