Commit ebf5bd39 authored by Carlos Garnacho's avatar Carlos Garnacho
Browse files

Add gtk_render_activity()

This method will render progress bars and spinners, these should
handle active and inconsistent states' animation progress in order
to perform animations.
parent af1f8701
......@@ -3043,3 +3043,26 @@ gtk_render_handle (GtkStyleContext *context,
_gtk_theming_engine_set_context (priv->theming_engine, context);
engine_class->render_handle (priv->theming_engine, cr, x, y, width, height);
}
void
gtk_render_activity (GtkStyleContext *context,
cairo_t *cr,
gdouble x,
gdouble y,
gdouble width,
gdouble height)
{
GtkStyleContextPrivate *priv;
GtkThemingEngineClass *engine_class;
g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
g_return_if_fail (cr != NULL);
priv = context->priv;
engine_class = GTK_THEMING_ENGINE_GET_CLASS (priv->theming_engine);
store_animation_region (context, x, y, width, height);
_gtk_theming_engine_set_context (priv->theming_engine, context);
engine_class->render_activity (priv->theming_engine, cr, x, y, width, height);
}
......@@ -258,7 +258,7 @@ void gtk_render_handle (GtkStyleContext *context,
gdouble y,
gdouble width,
gdouble height);
void gtk_render_progress (GtkStyleContext *context,
void gtk_render_activity (GtkStyleContext *context,
cairo_t *cr,
gdouble x,
gdouble y,
......
......@@ -162,6 +162,12 @@ static void gtk_theming_engine_render_handle (GtkThemingEngine *engine,
gdouble y,
gdouble width,
gdouble height);
static void gtk_theming_engine_render_activity (GtkThemingEngine *engine,
cairo_t *cr,
gdouble x,
gdouble y,
gdouble width,
gdouble height);
G_DEFINE_TYPE (GtkThemingEngine, gtk_theming_engine, G_TYPE_OBJECT)
......@@ -213,6 +219,7 @@ gtk_theming_engine_class_init (GtkThemingEngineClass *klass)
klass->render_frame_gap = gtk_theming_engine_render_frame_gap;
klass->render_extension = gtk_theming_engine_render_extension;
klass->render_handle = gtk_theming_engine_render_handle;
klass->render_activity = gtk_theming_engine_render_activity;
/**
* GtkThemingEngine:name:
......@@ -2714,3 +2721,89 @@ gtk_theming_engine_render_handle (GtkThemingEngine *engine,
gdk_rgba_free (bg_color);
}
static void
gtk_theming_engine_render_activity (GtkThemingEngine *engine,
cairo_t *cr,
gdouble x,
gdouble y,
gdouble width,
gdouble height)
{
if (gtk_theming_engine_has_class (engine, "spinner"))
{
GtkStateFlags state;
guint num_steps, step;
GdkRGBA *color;
gdouble dx, dy;
gdouble progress;
gdouble radius;
gdouble half;
gint i;
gtk_theming_engine_get_style (engine,
"num-steps", &num_steps,
NULL);
state = gtk_theming_engine_get_state (engine);
gtk_theming_engine_get (engine, state,
"color", &color,
NULL);
if (num_steps == 0)
num_steps = 12;
if (gtk_theming_engine_state_is_running (engine, GTK_STATE_ACTIVE, &progress))
step = (guint) (progress * num_steps);
else
step = 0;
cairo_save (cr);
cairo_translate (cr, x, y);
/* draw clip region */
cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
dx = width / 2;
dy = height / 2;
radius = MIN (width / 2, height / 2);
half = num_steps / 2;
for (i = 0; i < num_steps; i++)
{
gint inset = 0.7 * radius;
/* transparency is a function of time and intial value */
gdouble t = (gdouble) ((i + num_steps - step)
% num_steps) / num_steps;
cairo_save (cr);
cairo_set_source_rgba (cr,
color->red,
color->green,
color->blue,
color->alpha * t);
cairo_set_line_width (cr, 2.0);
cairo_move_to (cr,
dx + (radius - inset) * cos (i * G_PI / half),
dy + (radius - inset) * sin (i * G_PI / half));
cairo_line_to (cr,
dx + radius * cos (i * G_PI / half),
dy + radius * sin (i * G_PI / half));
cairo_stroke (cr);
cairo_restore (cr);
}
cairo_restore (cr);
gdk_rgba_free (color);
}
else
{
gtk_theming_engine_render_background (engine, cr, x, y, width, height);
gtk_theming_engine_render_frame (engine, cr, x, y, width, height);
}
}
......@@ -151,6 +151,12 @@ struct _GtkThemingEngineClass
gdouble y,
gdouble width,
gdouble height);
void (* render_activity) (GtkThemingEngine *engine,
cairo_t *cr,
gdouble x,
gdouble y,
gdouble width,
gdouble height);
};
GType gtk_theming_engine_get_type (void) G_GNUC_CONST;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment