Rework how button state is managed to decouple it from camera.js