-
Notifications
You must be signed in to change notification settings - Fork 0
/
bubble.vala
76 lines (61 loc) · 1.96 KB
/
bubble.vala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
public abstract class Bubble : Clutter.CairoTexture {
public static const short RADIUS = 30;
private static const short EXPAND_TIME = 300;
private static const short OPACITY = 200;
private static const short IDLE_TIME = 2500;
private Cairo.Context cr;
private Clutter.BehaviourScale behaviour_scale;
private Clutter.Alpha alphascale;
private Clutter.Timeline scale_time;
private Clutter.Timeline idle_time;
private ulong signal_handler;
public signal void end_fadeout (Bubble b);
public Bubble (Clutter.Color color) {
this.set_anchor_point_from_gravity (Clutter.Gravity.CENTER);
this.set_surface_size (RADIUS*2, RADIUS*2);
this.opacity = OPACITY;
//FIXME : would it be better to use the opacity in the color ?
cr = this.create ();
Clutter.cairo_set_source_color (cr, color);
cr.arc (RADIUS, RADIUS, RADIUS, 0, Math.PI*2);
cr.fill ();
cr = null;
scale_time = new Clutter.Timeline (EXPAND_TIME);
alphascale = new Clutter.Alpha.full (scale_time, Clutter.AnimationMode.EASE_OUT_BACK);
behaviour_scale = new Clutter.BehaviourScale (alphascale, 0, 0, 1, 1);
behaviour_scale.apply (this);
idle_time = new Clutter.Timeline (IDLE_TIME);
idle_time.completed.connect ( () =>
{
fadeout ();
});
}
~Bubble () {
this.behaviour_scale.remove_all ();
}
public void expand () {
behaviour_scale.set_bounds (this.scale_x, this.scale_y, 1, 1);
scale_time.start ();
signal_handler = scale_time.completed.connect ( () =>
{
idle_time.start ();
});
}
public void fadeout () {
behaviour_scale.set_bounds (0, 0, 1, 1);
scale_time.direction = Clutter.TimelineDirection.BACKWARD;
scale_time.start ();
scale_time.disconnect (signal_handler);
signal_handler = scale_time.completed.connect ( () =>
{
end_fadeout (this);
});
}
public void reset () {
this.set_scale (1, 1);
scale_time.stop ();
scale_time.direction = Clutter.TimelineDirection.FORWARD;
scale_time.disconnect (signal_handler);
idle_time.stop ();
}
}