Yeah it's the bigger picture where it gets tricky. But if we modularise things and design those building blocks correctly (eg use millis() not delay()) then it should be easy to plug the blocks together.
BTW just in case you or anyone is wondering: it's often a requirement to look for a button to become pressed, rather than be pressed, and that's explained well in the StateChangeDetection example. It was unnecessary to use that technique in my code, since as soon as the IDLE state saw the button was pressed (low), it left that state. Implicit in that, was the fact that as soon as it saw the button was low, that meant a new press, since if it was an old (ie continuing) press, it wouldn't have been in the IDLE state to look for it anyway.