I'm uneasy about not having this flag set for 300ms. What if the user hits pause and then hits play again in less than 300ms?   I think self.videoPlaying is still true, so handleVideoPlay() returns immediately and we end up with the video playing with the preview menu faded in.

If we can avoid race conditions entirely that would be best. Does it work okay if you just cross-fade and have the preview toolbar fade in while the video controls are fading out?

Also, if the preview toolbar was not shown before the video was played, do you really want to make the appear again here when the video stops?  That actually seems like a bug to me.  (Unrelated to this one, so you don't have to fix it here, but you could.)