This patch does a few things...
Introduces the concept of an 'empty frame' to the data. This is just a simple calculation to see if the width of the layer contents is 0
Based off that data change, the timeline docker can show if a keyframe has content in it or not.
It also has a display of a "hold" frame. If the frame is part of a hold frame, it will show a line through the frame
I also added a slightly color change to a row if it is selected. The active row gets things applied to it so I think it needs to be called out more than it is right now on the left side by the layer name.
There are quite a few more states now to how the color is shown, so I refactored that color calculation and turned it into multiple passes to make it easier to read.
There is a "hack" that I feel needs to be looked at. The timeline display won't repaint itself, so I ended up quickly changing the current time back and forth to force a refresh. Maybe there is a better way to do it.