/Animation /CSS /Classes /NewAPI /Renderer /StackedDrawing /Styleable |
Animation Framework
Some (very) rough ideas...
Add an extra function to the style object called draw_animation, which handles setting up any animations within the theme. The would be called whenever there is a change in a property that affects the display (i.e. causes a redraw) of a widget. The theme would then either return NULL (this is not animated), or would create and return a Timeline to gtk, specifying the length of the animation, the frame rate, and a callback to paint the animation. The timeline would also support loops for continuous animations.
Thing to consider:
- transitions require previous and current state information
- some animations may be continuous (e.g. progress bar)
An animation prototype might look like:
void animation_cb (Timeline *timeline, StyleContext *contexts[2]) { cairo_t *cr; int pos, len; StyleContext *old_context = contexts[0]; StyleContext *new_context = contexts[1]; cr = style_context_cairo_create (new_context); pos = timeline_get_position (timeline); len = timeline_get_length (timeline); /* extrapolate colour from new and old colours, based on timline position and length */ color = old_context->color + (old_context->color - new_context->color) * (pos / len); cairo_rectangle (cr, new_context->x, new_context->y, new_context->width, new_context->height); cairo_fill (cr); cairo_destroy (cr); } Timeline* draw_animation (StyleContext *new_context StyleContext *old_context) { Timeline *timeline; StyleContext *contexts = { new_context, old_context }; if (new_context->class == "button" && (new_context->changes & CONTEXT_CHANGED_STATE)) timeline = timeline_new (frame_rate, length, animation_cb, contexts) else timeline = NULL; return timeline; }